Java Hibernate:在HQL/QueryDSL中用一个join语句初始化所有子级?
我们现在正在使用QueryDSL进行数据库查询,但我认为这个问题通常与hibernate有关 我想知道:HQL是否将我查询的实体放入hibernate上下文/缓存中,以便从那里访问它们?我在想,如果我为一个实体运行一个大的Java Hibernate:在HQL/QueryDSL中用一个join语句初始化所有子级?,java,hibernate,jpa,hql,querydsl,Java,Hibernate,Jpa,Hql,Querydsl,我们现在正在使用QueryDSL进行数据库查询,但我认为这个问题通常与hibernate有关 我想知道:HQL是否将我查询的实体放入hibernate上下文/缓存中,以便从那里访问它们?我在想,如果我为一个实体运行一个大的leftjoin,显式地收集所有子关系,如果我能告诉hibernate在将结果映射到实体对象时使用这些信息,我应该能够节省延迟加载。我就是不知道怎么 示例: A有B,B有Cs。现在,如果我为某个特定的a构建查询以获取所有,并将其与Bs和Cs(查询DSL实现)连接起来: 因此,结
leftjoin
,显式地收集所有子关系,如果我能告诉hibernate在将结果映射到实体对象时使用这些信息,我应该能够节省延迟加载。我就是不知道怎么
示例:
A有B,B有Cs。现在,如果我为某个特定的a构建查询以获取所有,并将其与Bs和Cs(查询DSL实现)连接起来:
因此,结果应该足以让hibernate初始化
as.get(index).getBs()
as.get(index).getBs().get(index).getCs()
但它不会这样做,而是会对
select ... from B where B.aId = ??
是否有可能通过使用一个join初始化一个包含所有子项的实体来减少这些延迟加载,还是我希望的太多了
如果我用一个连接加载所有数据,hibernate会将它们放在缓存中吗?它会为那些延迟加载访问该缓存还是轮询数据库?我是有发言权还是完全不受我的控制
谢谢大家 在HQL查询中,您需要使用fetch
关键字来执行此操作:
select a from A a left join fetch a.cs b left join fetch b.cs where ...
这在本文中得到了很好的解释
我从未使用过QueryDSL,但根据,您只需要在每次连接后调用fetch()方法来添加此fetch关键字:
query.from(QA.a).leftJoin(QA.a.b,QB.b).fetch().leftJoin(QB.b.c,QC.c).fetch().where...
对不起,我忘了在我的帖子里提到这个。我确实尝试过使用fetch
,但没有成功。事实证明,解决方案是使用
@Fetch(FetchMode.JOIN)
在实体属性处。是否尝试了不带别名参数的leftJoin/fetch?否,没有尝试。。如果我不使用别名,源代码和查询将膨胀。。。但我会试试看。根据关系,我使用innerJoin和leftJoin。
query.from(QA.a).leftJoin(QA.a.b,QB.b).fetch().leftJoin(QB.b.c,QC.c).fetch().where...
@Fetch(FetchMode.JOIN)