2

我们现在正在使用 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 = ??

是否有可能通过初始化一个包含所有子节点的实体来减少这些延迟加载,还是我希望太多?

如果我使用连接加载所有数据,休眠会将它们放在其缓存中,并且它会访问该缓存以进行那些延迟加载还是会轮询数据库?我对此有发言权还是完全不在我的掌控之中?

谢谢@大家!

4

2 回答 2

4

在 HQL 查询中,您需要使用fetch关键字来执行此操作:

select a from A a left join fetch a.cs b left join fetch b.cs where ...

这在Hibernate 文档中有很好的解释。

我从未使用过 QueryDSL,但根据其文档,您只需在每次加入后调用 fetch() 方法即可添加此 fetch 关键字:

query.from(QA.a).leftJoin(QA.a.b,QB.b).fetch().leftJoin(QB.b.c,QC.c).fetch().where...
于 2012-06-25T14:32:11.737 回答
1

对不起,我忘了在我的帖子中提到这一点。我确实尝试使用fetch但没有成功。原来解决方案是使用

@Fetch(FetchMode.JOIN)

在实体属性。

于 2012-06-26T08:55:27.953 回答