2011-09-19 74 views
1

在我的對象圖中,VendorServiceRateChange有一個懶加載屬性IList<VendorService> VendorServiceList,VendorService有一個懶加載屬性IList<ClientService>NHibernate FetchMode笛卡爾積

當我運行下面的代碼時,我的VendorServiceList和我的ClientServiceList之間得到了一個Cartesian產品。

queueList = session 
    .CreateCriteria<VendorRateChange>() 
    .Add(Restrictions.IsNull("ProcessedDate")) 
    .Add(Restrictions.Le("EffectiveDate", DateTime.Now)) 
    .SetFetchMode("VendorServiceList", FetchMode.Join) 
    .SetFetchMode("VendorServiceList.Vendor", FetchMode.Join) 
    .SetFetchMode("VendorServiceList.CityService", FetchMode.Join) 
    .SetFetchMode("VendorServiceList.ClientServices", FetchMode.Join) 
    .SetResultTransformer(new DistinctRootEntityResultTransformer()) 
    .AddOrder(new Order("Audit.CreatedDate", true)) 
    .List<VendorRateChange>(); 

有沒有一種方法來組織使用的標準或DetachedCriteria之後,不會導致笛卡爾乘積作爲我VendorServiceList此查詢?我不希望在初始查詢返回後,對「VendorServiceList.ClientServices」上的提取進行註釋並使用Initialize調用進行循環。

在此先感謝。

回答

1

在開始創建笛卡爾產品之前,您可以擁有一個FetchMode.Join。如果將其他人切換到FetchMode.Select或其他東西,該怎麼辦?

+0

不FetchMode.Select使這些屬性延遲加載?我的目標是通過一次訪問數據庫來填充所有值。 – rie819

+1

FetchMode.Select使用另一個Select查詢來填充該數據,而不是使用連接。 –

+0

@Cole W謝謝,我只是假設Join意味着渴望而選擇意味着懶惰。 – rie819

3

您確定這是一個笛卡爾產品,或者您剛剛收到重複列表中的「重複」行嗎? 如果是這樣,在.List()之前,嘗試呼叫.SetResultTransformer(Transformers.DistinctRootEntity),因爲通過提前獲取關聯的集合,您會收到一個包含相同實體的重複項的列表。

+0

假設它和.SetResultTransformer(新的DistinctRootEntityResultTransformer())一樣,那麼是的,我已經調用它了。它可能只是重複的行,但它不是重複的根。我在VendorServiceList級別獲得額外的行,並且不知道如何清除它們。 – rie819

+0

Hibernate的最新版本:.setResultTransformer(DistinctRootEntityResultTransformer.INSTANCE); –