我发现了这个我想要理解的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
注意c
或WHERE
条款中未使用ORDER BY
。
用更简单的方法替换此查询似乎是安全的:
SELECT p FROM Parent AS p
WHERE p.state = 1
ORDER BY p.modified
但我不确定是否有正当理由原始查询是按原样编写的。
答案 0 :(得分:3)
根据Hibernate文档:
“fetch”连接允许使用单个select来初始化值的关联或集合及其父对象。这在集合的情况下特别有用。它有效地覆盖了关联和集合的映射文件的外连接和延迟声明。
http://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhql.html
因此,只有“fetch”连接才会导致引用的集合加载。在您的情况下,您没有“获取”连接,因此我认为不会通过此查询加载子集合。
换句话说,是的,你可以用第二个替换查询。