Hibernate HQL:使用JOIN急切加载子实体?

时间:2010-12-06 22:14:21

标签: hibernate hql

我发现了这个我想要理解的HQL查询。评论说LEFT JOIN导致Hibernate急切地加载子表中的关联实体,并且需要DISTINCT修饰符来过滤掉结果集中的重复父实体。这些评论有意义吗?我以前没见过以这种方式使用过的连接。

SELECT DISTINCT p FROM Parent AS p
LEFT JOIN p.children AS c
WHERE p.state = 1
ORDER BY p.modified

注意cWHERE条款中未使用ORDER BY

用更简单的方法替换此查询似乎是安全的:

SELECT p FROM Parent AS p
WHERE p.state = 1
ORDER BY p.modified

但我不确定是否有正当理由原始查询是按原样编写的。

1 个答案:

答案 0 :(得分:3)

根据Hibernate文档:

  

“fetch”连接允许使用单个select来初始化值的关联或集合及其父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外连接和延迟声明。

http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html

因此,只有“fetch”连接才会导致引用的集合加载。在您的情况下,您没有“获取”连接,因此我认为不会通过此查询加载子集合。

换句话说,是的,你可以用第二个替换查询。