2012-04-18 8 views
1

私は基本的にこれを行うHQLクエリを持つようにしたい:複数の集計関数

select quarter, sum(if(a>1, 1, 0)) as res1, sum(if(b>1, 1, 0)) as res2 from foo group by quarter; 

私はSummary Class ->

Class Summary 
{ 
long res1; 
long res2; 
int quarter; 
} 

どのように私はこれを達成することができますと私の出力リストとしてリストが欲しいですHQLでの集約?ターゲットオブジェクトのハイバネートマッピングは何ですか? List<Object[]>を返すSQLの種類のクエリを使用せずに、それをList<Summary>に変換する

答えて

2

Summaryはエンティティではないため、マッピングは必要ありません。適切なコンストラクタを作成し、代わりにHQLコンストラクタ式を使用できます。集計関数とifを使用することもできますが、ifの代わりにcaseという構文を使用する必要があります。だから、

Fooが、それは次のようになり、テーブルFooにマッピングされたエンティティである場合:

select new Summary(
    f.quarter, 
    sum(case when f.a > 1 then 1 else 0 end), 
    sum(case when f.b > 1 then 1 else 0 end) 
) from Foo f group by f.quarter 

も参照してください:

+0

すごいです。これは非常に有望に見えます。ありがとうございました。私はそれを試してみます。 –

0

マッピングで副選択を使用している可能性があります。休止状態のドキュメントでMore complex association mappingsを見てください。私はその可能性を試したことはありません。

しかし、たとえ休止人はお勧め「を...しかし、HQLまたは基準クエリを使用した例これらの種類を処理するために、より実用的である。」それは、私がどうなるのかです:HQL文でグループバイを使用しますリストを操作してください。このリストを適切なオブジェクトのリストにコピーする余分な時間は、グループバイがデータベースで使用している時間と比較して無視できる程度です。しかし、あなたはこの可能性が気に入らないようです。

第3の可能性は、グループバイビューを含むデータベース内のビューを定義し、このビューの通常のマッピングを作成することです。