我们现在正在使用 QueryDSL 进行数据库查询,但我认为这个问题更普遍与休眠相关..
我想知道:HQL 是否将我查询的实体放入休眠上下文/缓存中,以便可以从那里访问它们?我在想,如果我leftjoin
为一个实体运行一个大数据,明确地收集所有子关系,如果我可以告诉休眠在将结果映射到我的实体对象时使用该信息,我应该能够节省延迟加载。我就是想不通怎么办。。
示例:
A 有 Bs,B 有 Cs。现在,如果我fetch all
为某个 A 构建查询并将其与 Bs 和 Cs 连接(查询 DSL 实现):
List<A> as = query.from(QA.a).leftJoin(QA.a.b,QB.b).leftJoin(QB.b.c,QC.c).where(a.id.eq("1)).fetchAll();
我会得到一个很好的 SQL 语句,上面写着
select... from A inner join B ... inner join C ... where ...
所以结果应该足以让hibernate初始化
as.get(index).getBs()
as.get(index).getBs().get(index).getCs()
但它不会这样做,而是会运行查询
select ... from B where B.aId = ??
是否有可能通过初始化一个包含所有子节点的实体来减少这些延迟加载,还是我希望太多?
如果我使用连接加载所有数据,休眠会将它们放在其缓存中,并且它会访问该缓存以进行那些延迟加载还是会轮询数据库?我对此有发言权还是完全不在我的掌控之中?
谢谢@大家!