2010-07-07 18 views
3

我有以下標準查詢(使用lambda擴展):NHibernate的 - 設置孫子提取模式對象

var workflowResult = repository.GetSession() 
       .CreateCriteria<Core.Domain.Application>() 
       .SetFetchMode<Core.Domain.Application>(app => app.ApplicationWorkflows, FetchMode.Join) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<Core.Domain.Application>(); 

這是正常工作。每個應用程序都熱切地加載 ApplicationWorkflows集合。但是,我想更深入一個 並加載每個ApplicationWorkflow的ApplicationStatus對象。我 能做到這一點有以下HQL但是想轉換爲 標準:

var workflowQuery = "SELECT DISTINCT app" + 
           " FROM Application app" + 
           " JOIN FETCH app.ApplicationWorkflows awf" + 
           " JOIN FETCH awf.ApplicationStatus"; 

我一直建議使用以下,但我有它的問題在所有情況下工作:

.SetFetchMode<Core.Domain.Application>(app => app.ApplicationWorkflows[0].ApplicationStatus, FetchMode.Join) 
+0

您確定HQL有效嗎?我在過去曾嘗試過類似的東西,並且遇到了重複的問題。 'DistinctRootEntity'沒有做我期望的遞歸連接抓取。 – 2010-07-12 17:05:25

+0

嗯,我以爲是的。讓我檢查確定。感謝您的領導! – 2010-07-12 17:31:32

+0

[這個答案](http://stackoverflow.com/questions/5266180/fighting-cartesian-product-x-join-when-using-nhibernate-3-0-0/5285739#5285739)幫助我看看如何使用QueryOver和Future查詢可以在不返回重複項的情況下快速獲取子孫。該技術涉及將任務分解成單獨的SQL查詢,這些SQL查詢在數據庫的一個往返中執行。 – 2011-10-20 17:00:05

回答

0

試試這個。

var workflowResult = repository.GetSession() 
       .CreateCriteria<Core.Domain.Application>() 
       .CreateAlias("ApplicationWorkflows", "awf") 
       .SetFetchMode("ApplicationWorkflows", FetchMode.Join) 
       .SetFetchMode("awf.ApplicationStatus", FetchMode.Join) 
       .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
       .Future<Core.Domain.Application>(); 
+0

我最後一次檢查時,當你做孫子們這樣做時,'DistinctRootEntity'不起作用。確保這不會返回重複。 – 2010-07-12 17:03:28

相關問題