2010-02-07 78 views
3

我有一個對象模型是這樣的:NHibernate的:在第二層次的集合不同的結果

class EntityA 
    { 
     ... 
     IList<EntityB> BList; 
     ... 
    } 

    class EntityB 
    { 
     ... 
     IList<EntityC> CList; 
    } 

我必須獲取所有colelctions(Blist在EntityA和欄列表中EntityB),因爲如果他們都將需要做一些操作,如果我不急於加載他們,我會有選擇n + 1的問題。 所以查詢是這樣的:

select a from EntityA a left join fetch a.BList b left join fetch b.CList c 

拳頭問題我碰到這樣的查詢,是重複的從數據庫返回的,我有EntityA重複,因爲左聯同BList取。 通過hibernate文檔快速閱讀,並有一些解決方案,首先我嘗試了不同的關鍵字,supposelly不會複製SQL distinct關鍵字,除非在某些情況下,也許這是其中一種情況,因爲我有一個SQL錯誤說,我無法選擇distict文本列(EntityA表中的[Observations]列)。所以我使用其他解決方案之一:

query.SetResultTransformer(new DistinctRootEntityResultTransformer()); 

這工作正常。但操作的結果仍未通過測試。我進一步檢查,發現現在有重複的EntityB,因爲CList的左連接獲取。

問題是,我怎樣才能在第二級集合中使用獨特的?我搜索我只找到了根實體的直接子採集解決方案,但從來沒有第二個級別的子集...

謝謝您的時間

+0

見我的回答這個[問題] [1](這幾乎是相同的副本:-)) [1]:HTTP://計算器。com/questions/7614661/loading-multi-level-collections-without-duplicates-in-nhibernate/7615646#7615646 – Goblin 2011-09-30 20:23:00

回答

0

你不能完成你以簡單的方式想要什麼。我相信這是導致重複的C的左連接獲取。生成的查詢是這樣的:

select a 
left join a.b b 
left join b.c c 

,並通過數據庫返回的行會是這樣:

1: a1 | b1 | c1 
2: a1 | b1 | c2 
3: a1 | b2 | c3 
4: a1 | b2 | c4 
... 

Althouh你已經過濾了根實體副本(在一個的),由於C上的外連接,DB需要返回C的條目中的每一個的表的重複條目。 解決此問題的一個簡單方法是通過實用程序集合篩選項目。根據您的實體要求,您也可以使用HashSet,以便自動將其濾除。

0

使用ISet而不是IList(並將其映射爲集合,而不是作爲包)。

一個Set不允許重複的實體。

+0

這隻適用於第一個集合。第二個集合仍然包含重複的條目。我在這裏遇到同樣的問題,但仍未找到解決方案。 – 2013-02-25 07:55:39

0

我遇到了同樣的問題,無法通過hql解決重複問題。但是,我爲所有集合創建了IEqualityComparer,並在每個集合上執行了Disinct()以消除hql結果上的重複項。

相關問題