我有3個相關的對象(Entry,GamePlay,Prize),我試圖找到最好的方式來查詢他們爲我需要使用NHibernate。當有請求進入時,我需要在Entries表中查詢匹配的條目,並且如果找到的話,可以得到a)最新的遊戲以及附帶獎品的第一場遊戲。獎品是GamePlay的子項,每個Entry對象都有一個GamePlays屬性(IList)。NHibernate標準查詢問題
目前,我正在研究一種方法來拉取匹配的條目,並熱切地加載所有遊戲和相關獎品,但加載所有遊戲只是爲了找到最新的遊戲以及任何包含獎品的遊戲似乎是浪費。
現在,我的查詢看起來是這樣的:
var entry = session.CreateCriteria<Entry>()
.Add(Restrictions.Eq("Phone", phone))
.AddOrder(Order.Desc("Created"))
.SetFetchMode("GamePlays", FetchMode.Join)
.SetMaxResults(1).UniqueResult<Entry>();
兩個問題:
- 它加載所有的遊戲玩了前面。利用365天的數據,這可以輕鬆地將每個查詢的數據擴展到300k。
- 它並不急於加載每個遊戲的獎品屬性。因此,我通過GamePlays列表尋找非空獎的代碼必須進行調用才能加載我檢查的每個Prize屬性。
我不是一個nhibernate專家,但我知道必須有一個更好的方法來做到這一點。理想情況下,我想這樣做以下(僞):
entry = findEntry(phoneNumber)
lastPlay = getLatestGamePlay(Entry)
firstWinningPlay = getFirstWinningGamePlay(Entry)
當然,最終的結果是,我有條目的詳細信息,最新的遊戲,和第一個贏取的遊戲。問題是我想盡可能少地調用數據庫,否則我只執行3個單獨的查詢。
對象定義是這樣的:
public class Entry
{
public Guid Id {get;set;}
public string Phone {get;set;}
public IList<GamePlay> GamePlays {get;set;}
// ... other properties
}
public class GamePlay
{
public Guid Id {get;set;}
public Entry Entry {get;set;}
public Prize Prize {get;set;}
// ... other properties
}
public class Prize
{
public Guid Id {get;set;}
// ... other properties
}
正確的NHibernate的映射到位,所以我只需要幫助搞清楚如何設置的條件查詢(不找HQL,不使用它)。
HQl比標準更強大。標準適用於動態查詢,HQL適用於複雜的查詢。 HQL還有其他的好處,例如你可以將它們存儲在預編譯的映射文件中。 – 2009-11-24 14:38:13
是的,HQL功能更強大,但它聽起來像用戶想堅持直接標準。我可以挖掘它。 – 2009-11-24 15:17:49
@Chris:嘗試用SQL思考。你會發出什麼樣的詢問以最佳方式獲取數據?您可以使用3個帶小結果集的查詢或帶有大結果集的查詢。請記住,NHibernate只能生成SQL,它不能以任何其他方式從數據庫中獲取內容。 – 2009-11-24 15:28:53