2011-03-14 37 views
1

一些快速NHibernate的問題:NHibernate如何使標準內部連接沒有保溼對象?

我有SQL表:

Item { Id, Name } 
ItemRange { Id, Name } 
ItemHasItemRange { Id, ItemId, ItemRangeId } 

映射是簡單的,所以我不會將它們粘貼,該項目Id和ItemRangeId外鍵,項目類有ItemHasItemRanges集合映射爲懶惰袋。

我想要特別是ItemRange的所有項目,但我不想檢索關聯的ItemRangeObjects,我只是想做內部連接來縮小結果。

當我那樣做:

c.CreateCriteria("Item", "i") 
    .CreateAlias("ItemHasItemRanges", "ihpr", JoinType.InnerJoin) 
    .Add(Restrictions.Eq("ihpr.ItemRange.Id", I18nHelper.CurrentItemRange.Id)); 

它工作正常,但所有ItemHasItemRange對象獲取以及在Item.ItemHasItemRanges集合(其被映射爲懶惰)

我不想獲取Item.ItemHasItemRanges,因爲它需要時間。我只是想進行內部連接來限制結果集。 NHibernate中可能嗎?

+0

當您使用'CreateCriteria'而不是'CreateAlias'時會發生什麼? – 2011-03-14 09:14:50

+0

IMO,它應該按照您的預期工作。你可以嘗試在查詢中顯式設置FetchMode(使用'SetFetchMode')。 – 2011-03-14 09:31:41

+0

我已經嘗試與'.SetFetchMode(「ItemHasItemRanges」,FetchMode.Lazy);' - 生成的查詢是相同的。同樣的事情'CreateCriteria' - 據我所知,CreateCriteria不同於CreateAlias只是通過返回的對象植根於新的標準,而不是我們開始的標準。所有字段仍然在選擇列表中,即使是那些應該是懶惰的。 – Adam 2011-03-14 10:12:08

回答

0

東西,我發現這個問題是其他地方。 ItemHasItemRange表在ItemId和ItemRangeId上沒有多個索引 - 每個字段只有單獨的索引。這就是爲什麼表現如此糟糕。

但NHibernate的問題仍然有效 - 是否有可能創建內部連接的條件只是爲了縮小結果,而不是獲取所有連接的對象通常是懶惰的。

0

因此,我認爲你只是想要檢索這些對象來顯示一個概覽/列表,而且你不會真的用這些對象「做」某些東西(除非可能加載其中一個)?

在這種情況下,我認爲您最好使用'預測'。 這裏的情景:

  • 你必須創建一個(簡單)類,僅僅包含你想顯示(其中你感興趣)的屬性。

  • 您必須將該類導入到NHibernate中,以便NHibernate知道它的存在。

  • 接下來,您可以像現在一樣創建Criteria語句。 (使用您的域類)。

  • 然後,您應該指定投影的樣子。也就是說,你的Item實體的屬性如何映射到你的'DTO'/ View類(=剛創建的簡單類)的屬性。

  • 指定應使用ResultTransformer的AliasToBean

然後,執行您的標準查詢。 NHibernate將能夠生成所需的最簡單的查詢,以便檢索所有必需的數據。

我已經解釋了類似here

+0

這是個好主意,但是Item類還有其他一些必須加載的東西(如加入的翻譯等)。所以我希望所有的對象能夠在映射中定義的正常加載,但我不想加載惰性對象,即使我將它們加入到條件中。我試圖強制FetchMode懶惰ItemHasItemRanges,但它沒有效果 - 生成的查詢是相同的。 – Adam 2011-03-14 09:22:34