2010-03-29 30 views
1

在nHibernate中,如果您通過「join fetch」執行HQL查詢以加載子集合,nHibernate將忽略SetMaxResults和SetFirstResult,並嘗試從數據庫中檢索每個項目的。爲什麼?這種行爲是特定於HQL的,因爲ICriteria支持急切的加載(儘管有外連接)和LIMIT。爲什麼nHibernate在進行「連接讀取」時不支持LIMIT?

這裏有更多的細節http://www.lesnikowski.com/blog/index.php/nhibernate-ignores-setmaxresults-in-sql/

進一步的主題,關於與「連接抓取」(如獲取笛卡爾乘積的結果)等問題

:如指出herehere,可以熱切負載子集合既HQL和的ICriteria。然而,ICriteria不允許內部連接(產生笛卡爾積),而DB邊的結果是HQL doesn't allow paging

和如果必須做同樣的事情,但分頁怎麼辦?

SetMaxResults,但這可能會導致加載問題。 在這一點上,我可能想要執行兩個完全獨立的查詢,首先得到實體,然後加載相關的關聯。

那麼在這裏分頁的問題是什麼,以及可能的解決方案是什麼?

回答

2

它看起來像nHibernate試圖填充整個子集合通過總是在急切加載的集合上進行外連接,這會導致具有相同左半部分的非同一組行。

Id | CollectionId 
------------------- 
    1 | 1 
    1 | 2 
    2 | 3 
    3 | 4 
    3 | 5 

你明白了。對於這樣的行集合,LIMIT沒有任何意義,因爲你實際上會限制nHibernate的內部數據,而不是限制你真正感興趣的結果集。然而,我還沒有找到一種方法來進行熱切加載。我認爲只用一個查詢可能是不可能的。

相關問題