2012-12-01 75 views
3

我有一個類似於下圖的類圖。使用NHibernate-Futures獲取ManyToOne

我使用這個例子,因爲它比解釋我工作的域更簡單。

public class Cheque { 

    public FinanceAccount Account {get;set;} 

    public Customer customer {get;set;} 

    public Branch Branch {get;set;} 
} 

一個Cheque實體有三個實體的休息ManyToOne關係。

現在的關係是不是雙向的

如何寫一個有效的期貨查詢獲取的Cheques列表,以便我沒有得到N + 1加載AccountCustomerBranch

我一直在使用左聯接嘗試,但想知道這是否可以使用簡化SQLS

回答

3

就可以達到所需的結果(無N + 1) - 期貨,但不會是正確的NHibernate的功能。我們可以使用它們,但獲取many-to-one實體的技巧在其他地方(見下文)。期貨如下陳述:http://ayende.com/blog/3979/nhibernate-futures平均:

...未來()和FutureValue()功能基本上作爲一種延遲查詢執行到以後的日子,在這一點的NHibernate將會對申請內容的詳細信息應該這樣做,並相應地進行優化

所以我們可以把更多的查詢放到一個批處理中。該查詢例如可以設定查詢導致:

  • 總檢查
  • 前20個檢查投影
  • 在上週

因此撤回最大金額,在這種情況下,我們可以將「不同」類型的查詢放入Future

但是爲了取得many-to-one沒有N + 1的實體 - 我們可以使用標準的Criteria API。所以,即使這些屬性被映射爲懶惰與選擇的獲取:

<many-to-one name="Account" class="FinanceAccount" column="AccountId" 
     lazy="proxy" fetch="select"/> 

這個標準將只創建一個選擇左聯接:

var list = session.CreateCriteria<Cheque>() 
    .SetFetchMode("Account", NHibernate.FetchMode.Join) 
    .SetFetchMode("customer", NHibernate.FetchMode.Join) 
    .SetFetchMode("Branch", NHibernate.FetchMode.Join) 
    .Future<Cheque>() 
    // or 
    // .List<Cheque>() ... will be the same right now 
    ; 

這將導致只有一個SQL SELECT語句,加入Check及其引用屬性。

+0

非常有意義 – frictionlesspulley