如何优化连接两个大表的HQL查询

时间:2018-06-06 19:05:59

标签: sql hibernate jpa hql

我有一个像这样的HQL查询:

Select foo
From Foo foo, Bar bar
Where foo.number = bar.number

但执行休眠需要4,5秒,因为这两个表非常大。 我用Hibernate stat和trace日志进行了跟踪,发现这个HQL查询执行500 Select!这就是为什么需要很多时间,因为我在第一张表中有3个manyToOne和7个ManyToOne& OneToMany在另一个。 有没有办法优化这个HQL查询而不使用它或将其转换为SQL查询?

如果使用本机SQL查询,我需要将对象的结果重新映射到我不喜欢的foo实体对象。

2 个答案:

答案 0 :(得分:0)

在没有实体代码的情况下,很难找到确切的答案,但是在大多数情况下,问题是 EAGER 关系。

  

我在第一个表中有3个ManyToOne,在另一个表中有7个ManyToOne和OneToMany。

第一步是确保所有ToOne映射都是LAZY而不是EAGER。每个ToOne@ManyToOne@OneToOne)关系都是EAGER 默认情况下。因此,将关系更改为LAZY

@ManyToOne(fetch = FetchType.LAZY)

或者:

@OneToOne(fetch = FetchType.LAZY)

还要确保ToMany关系是否不是 EAGER(默认情况下为LAZY)。

答案 1 :(得分:0)

您必须使用以下注释:

 @OneToMany(fetch = FetchType.LAZY, mappedBy = "your_mapping_name")
        @Cascade(CascadeType.ALL)
        @Fetch(FetchMode.SELECT)
            @BatchSize(size = 10)

有关更多信息,您可以查看:https://www.mkyong.com/hibernate/hibernate-fetching-strategies-examples/