我是JPA / JPQL的新手,所以如果这个问题不是很清楚,请原谅。
我正在尝试找到一个有效的JQPL查询,以获取复杂对象的所有记录。
(即由多个表表示,具有多个一对多关系 - 请参阅下面的简化示例):
class ComplexObject {
private Set< SubOject1> so1 ...
.....
@OneToMany(fetch = FetchType.LAZY)
public Set< SubOject1>...
}
class SubObject1 {
private Set< SubOject2> so2 ...
.....
@OneToMany(fetch = FetchType.LAZY)
public Set< SubOject2>...
}
我正在使用以下JPQL查询:
select distinct CO
from ComplexObject CO
left join fetch CO.so1 SO1
left join fetch SO1.so2
查询在无状态会话上运行,以便获取DB中当前数据的事实快照,该快照与实体管理器分离(因此使用左连接提取)。
不幸的是,我遇到了两个问题:
由于复杂对象包含so1的多个实例,并且每个so1实例包含多个so2实例,因此对SQL查询的基础转换会为所有表连接的每一行产生一个特定的选择查询 - 一个非常浪费的解决方案。有没有办法减少内部选择查询的数量? (这似乎是可怕的N + 1查询问题)。
JPQL查询在所有表连接的产品上为每个内部SQL查询返回一个ComplexObject实例 - 这意味着对ComplexObject实例的多次引用。为什么这会发生在选择不同的&#39;查询?
我使用的JPA框架是hibernate,而DB是HyperSQL。
(1)问题与使用p6spy
日志记录框架有关,该框架打印出来自大型数据库表的所有结果。日志记录格式导致错误的假设,即许多查询正在执行。
在尝试微调性能时,使用本机查询似乎没有比使用JPQL查询更好的性能。 使用本机查询也会导致对象类型的结果,这需要后期处理。