2011-03-01 17 views
1

linq2nhibernateで 'group by'を使用することに伴う多くの問題の後、私はHQLに切り替えることを試みましたが、私は簡単な例で苦労しています。HQLとグループ化

Group by

が、私は最高の定格フォーラムのスレッドの一覧を取得したいと思い、私は陽光柱として合計を行う必要があることを意味:

私は、次の表(ForumThreadRatings)を持っていますグループのフォーラムスレッド。私はちょうど運とHQLにすることにより、簡単なグループを行うために、たとえば試してみました:

select ftr.ForumThread from ForumThreadRating ftr group by ftr.ForumThread 

しかし、私は、次のエラーが表示さ:

Column 'ForumThreads.Id' is invalid in the select list because it is not contained in either an aggregate function or the GROUP BY clause. 

私は何をしない可能性がありますか? the docsから

答えて

2

:いずれの場合で

NHibernate currently does not expand a grouped entity, so you can't write group by cat if all properties of cat are non-aggregated. You have to list all non-aggregated properties explicitly.

、その正確なクエリをすることによって行うことができます

select distinct ftr.ForumThread from ForumThreadRating ftr 

しかし、あなたが必要となりますので、もちろん、あなたはおそらく、sumまたはcount何かに必要明示的にプロパティを集計する


アップデート:ここでトップ10のスレッドを取得する方法は次のとおりです。あなたが見ることができるように

var topThreads = session.CreateQuery(@" 
       select (select sum(case 
             when rating.Positive = true then 1 
             else -1 
            end) 
         from ForumThreadRating rating 
         where rating.ForumThread = thread), 
         thread 
       from ForumThread thread 
       order by 1 desc 
       ") 
       .SetMaxResults(10) 
       .List<object[]>() 

を、このクエリは二つの要素ごとにobject[]のリストを返します:[0]の評価であると[1]ですForumThread。

あなたが使用してちょうどForumThreads得ることができます。おかげで、私はでForumThreadRating FTRグループからftr.ForumThread.Id を選択」を試してみましたなど

.Select(x => (ForumThread)x[1]); 

またはDTOにそれらを投影し、

+0

をftr.ForumThread "はIDのリストを返しますが、同じクエリ内のオブジェクトをどのように取得できますか?私はhttp://docs.jboss.org/hibernate/core/3.3/reference/en/html/queryhqlにある "Select ForumThreads where Id in(select id ...)"と同様のものを見つけることを検討してきました。 htmlはそれを行う方法を見つけることができなかった? – Dofs

+0

@Dofs:実行したい*実際のクエリとは何ですか?つまり、結果セットは何ですか? –

+0

Hi Diegeo Mijelshon、私はトップ10のフォーラムスレッドを含むリストをレーティングで注文したいと思います。正または負(SOのような)のいずれかである可能性のある各格付けのエントリがあるので、順序は負の格付けの額で差し引かれた特定のスレッドの正の格付けの合計でなければなりません。 – Dofs

関連する問題