2009-11-04 85 views
2

我有一個NHibernate的問題,我似乎無法找到一個簡單的解決方法。NHibernate綜合子查詢

我有以下數據庫:

遊戲:ID,得分,Match_ID

匹配:ID

一場比賽由3場比賽。

我想找出最大匹配得分是什麼,所以下面的SQL會做的伎倆:

select max(a.total) from 
    (select Match.ID, sum(Game.Score) as total 
    from Game inner join Match 
    on Game.Match_ID = Match.ID 
    group by Match.ID) a 

在NHibernate的,這似乎是有點棘手。顯然,HQL不允許子條目中的子查詢,所以我不能真正使用它。

我很確定它可以用ICriteria完成,但我只是剛開始使用NH,所以我似乎無法弄清楚。我基本上有以下幾點:

Session.CreateCriteria<Game>() 
    .SetProjection(Projections.ProjectionList() 
     .Add(Projections.GroupProperty("Match")) 
     .Add(Projections.Sum("Score"))).List(); 

之後,我已經用的DetachedCriteria的各種花色品種玩耍了,只是似乎在圈子一輪去。

回答

6

對於HQL世界一個查詢的伎倆......

var maxScore = session.CreateQuery(@"select sum(game.Score) 
            from Game game 
            group by game.Match 
            order by sum(game.Score) desc") 
         .SetMaxResults(1) 
         .UniqueResult<long>(); 

希望這有助於。

更新:對於Criteria世界,可能會有更好的結果轉換,但這只是起作用:)

var max = (int)session.CreateCriteria<Game>("game") 
    .SetProjection(Projections.ProjectionList() 
         .Add(Projections.GroupProperty("game.Match")) 
         .Add(Projections.Sum("game.Score"), "total")) 
    .AddOrder(Order.Desc("total")) 
    .SetMaxResults(1) 
    .SetResultTransformer(Transformers.AliasToEntityMap) 
    .UniqueResult<IDictionary>()["total"]; 
+0

謝謝,HQL的工作原理。 – Carl 2009-11-05 19:40:13

1

我真的做這樣的SQL:

select top 1 Match.ID, sum(Game.Score) as total 
    from Game inner join Match 
    on Game.Match_ID = Match.ID 
    group by Match.ID order by total desc 

組由始終處於標準棘手/ HQL:因爲GROUP BY子句只能返回任何其他列的分組列和聚集。因此,不可能從group by子句中返回整個實體,而只能返回您正在分組和聚合的ID。

出於這個原因,我通常使用本地SQL這樣的查詢做組:

ISQLQuery sqlQuery1 = NHibernateSessionManager.Instance.GetSession().CreateSQLQuery("select Match.ID, sum(Game.Score) as total from Game inner join Match on Game.Match_ID = Match.ID group by match.ID order by total desc"); 
sqlQuery1.AddScalar("id", NHibernateUtil.Int32); // 
sqlQuery1.AddScalar("total", NHibernateUtil.Int32); 
sqlQuery1.SetMaxResults(1);  
var result = sqlQuery1.List(); 
+0

我甚至沒有想過改變這樣的查詢,謝謝!我實際上是'那些'之一,因爲之前將大部分事物作爲存儲過程來完成,因此將SQL放入我的代碼中可能不會發生。起初HQL讓我感到害怕,但我認爲它非常強大,所以我會沿着這條路線走下去。 – Carl 2009-11-05 19:39:01

+0

是啊!除了其他人捏我的SQL,並把它變成HQL! – reach4thelasers 2009-11-06 18:03:23