2010-12-06 64 views
3

我發現了這個HQL查詢,我試圖理解它。評論說,LEFT JOIN會導致Hibernate急切地加載子表中的關聯實體,並且需要使用DISTINCT修飾符來過濾掉結果集中的重複父實體。這些評論有意義嗎?我還沒有看到過使用這種方式的聯接。Hibernate HQL:使用JOIN來急切加載子實體?

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

注意c沒有在WHEREORDER BY子句中使用。

現在看來,這將是安全與簡單的更換此查詢:

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

但我不知道是否有很好的理由原始查詢被寫成是。

回答

3

根據Hibernate文檔:

A「取」聯接允許使用單個選擇它們的父對象一起被初始化值的關聯或集合。這在收集的情況下特別有用。它有效地覆蓋了關聯和集合映射文件的外連接和惰性聲明。

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

所以它只有「取」加入引起簡稱集合加載。在你的情況下,你沒有「獲取」連接,所以我不認爲通過這個查詢將加載子集合。

換句話說,是的,你可以用第二個替換查詢。