我有一个像这样的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实体对象。
答案 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/