2012-01-20 79 views
0

我有一個NHibernate的問題,當我使用HQL或Linq(Session.Query)獲取某些內容時,沒有使用我的映射配置來加載集合。 Session.Get和Session.QueryOver正在按照預期工作。HQL和Session.Query忽略映射中定義的渴望提取

我使用的是NHibernate 3.2。以下是我的產品映射中集合的映射。

<bag name="OrderItems" inverse="true" cascade="none" lazy="false" fetch="join"> 
    <key column="order_id" /> 
    <one-to-many class="OrderItem" /> 
</bag> 

和從另一側的映射如下所示:

<many-to-one name="Product" class="Product" column="product_id" not-null="true" /> 

我有4次試驗,2是全成和2則沒有。他們使用Session.SessionFactory.Statistics跟蹤CollectionFetchCount(在1個連接的查詢中或在單獨的查詢中選擇了OrderItems)。目的是在選擇產品時選擇並加載OrderItems,因爲OrderItems幾乎總是被訪問。

LastCreated是插入到數據庫中的最後一個產品的簡單參考。

[Test] /* Success */ 
public void Accessing_Collection_Using_Session_Get_Results_In_1_Select() 
{ 

    // Get by Id 
    var product = Session.Get<Product>(LastCreated.Id); 
    var count = product.OrderItems.Count; 
    Assert.AreEqual(0,statistics.CollectionFetchCount,"Product collectionfetchcount using Get"); 
} 


[Test] /* Success */ 
public void Accessing_Collection_Using_Session_QueryOver_Results_In_1_Select() 
{ 

    // Get by Id 
    var product = Session.QueryOver<Product>().SingleOrDefault(); 
    var count = product.OrderItems.Count; 
    Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using QueryOver"); 
} 
[Test] /* Fail */ 
public void Accessing_Collection_Using_Session_Query_Results_In_1_Select() 
{ 

    // Get by IQueryable and Linq 
    var product = Session.Query<Product>().Single(x => x.Id == LastCreated.Id); 

    var count = product.OrderItems.Count; 
    Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using Linq"); 
} 

[Test] /* Fail */ 
public void Accessing_Collection_Using_HQL_Results_In_1_Select() 
{ 

    // Get by IQueryable and Linq 
    var product = Session.CreateQuery("from Product where Id = :id") 
     .SetParameter("id",LastCreated.Id) 
     .UniqueResult<Product>(); 

    var count = product.OrderItems.Count; 
    Assert.AreEqual(0, statistics.CollectionFetchCount, "Product collectionfetchcount using HQL"); 
} 

這是預期的行爲還是我做錯了什麼?

回答

6

HQL查詢不會考慮在映射中設置的fetch="join"。這是因爲它們是自由形式的查詢,所以NH不可能猜測如何轉換它們以添加連接。

Linq被實現爲HQL的包裝器,QueryOver是Criteria的包裝器;這就是爲什麼你看到不同的行爲。

如果您需要的LINQ/HQL渴望負載,你必須讓他們在查詢中明確的(使用join fetchFetch()/FetchMany()

+0

感謝您的回答!我有點糊塗,雖然作爲參考的NHibernate來自nhforge的HQL表示:「另外,」fetch「連接允許使用單個select來將關聯或值集合與其父對象一起初始化,這對於集合來說特別有用,它有效地覆蓋了外層對於關聯和集合,映射文件的加入和延遲聲明「對我而言,暗示它應該查看映射文件,或者文檔討論覆蓋的行爲是什麼? – ds99jove

+0

如果映射沒有聲明任何渴望的提取, '用'join fetch'重寫它......這裏的doc文字有點誤導。 –