Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/348.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate:在HQL/QueryDSL中用一个join语句初始化所有子级?_Java_Hibernate_Jpa_Hql_Querydsl - Fatal编程技术网

Java Hibernate:在HQL/QueryDSL中用一个join语句初始化所有子级?

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实现)连接起来: 因此,结

我们现在正在使用QueryDSL进行数据库查询,但我认为这个问题通常与hibernate有关

我想知道:HQL是否将我查询的实体放入hibernate上下文/缓存中,以便从那里访问它们?我在想,如果我为一个实体运行一个大的
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)