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でこの集計を実現するにはどうすればよいですか?ターゲットオブジェクトのHibernateマッピングはどうなりますか?List<Object[]>返してから変換するSQLのようなクエリは使いたくありませんList<Summary>

4

2 に答える 2

4

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

したがって、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

参照:

于 2012-04-18T10:39:16.957 に答える
0

マッピングの副選択で可能かもしれません。Hibernateドキュメントのより複雑なアソシエーションマッピングをご覧ください。私はその可能性を試したことがありません。

しかし、休止状態の人でさえ、「...しかし、HQLまたは基準クエリを使用してこれらの種類のケースを処理する方が実用的です。」それが私が行うことです。HQLステートメントでgroup-byを使用し、リストを操作します。このリストを適切なオブジェクトのリストにコピーするための余分な時間は、group-byがデータベースで使用している時間と比較してごくわずかです。しかし、あなたはこの可能性が気に入らないようです。

3番目の可能性は、group-byを含むデータベースにビューを定義してから、このビューの法線マッピングを作成することです。

于 2012-04-18T10:17:01.160 に答える