2011-12-06 6 views
0

Hibernateを介してデータベースに格納された特定のデータの集約を行う必要があるため、必要なデータを取得するためにHQLを使用したいと思います。Hibernate - データを集約して新しいエンティティに変換するための良いアプローチ

Transaction 
    id 
    userEmail 
    moneyPaid 

現在、すべてのお金を集計する最良の方法は、userEmailで決められたユーザー別に支払われます。私は、aggregated moneyPaydプロパティを持つユーザのメールを持つエンティティを返却したいと思います。

これを行うには、どのように最もエレガントな方法がありますか?

そして、私は別のエンティティを持っている場合は、おそらくユーザー言う:

User 
    id 
    email 
    address 

トランザクション、集計moneyPaidでユーザーの参加などば完全に異なるタイプのエンティティのリストを返します多くのコードに関与しない任意の便利な方法があります:

AggregatedData 
    email 
    totalMoneyPaid 
    address 

私はこれを行ういくつかの方法を知っていますが、すべてエレガントで簡潔ですが、どんなアイデアも高く評価されています。

答えて

5
select u.email, sum(t.moneyPaid), u.address from Transaction t 
left join t.user u 
group by u.email, u.address; 

I'amは、[OK]をクリックすると、リターンとしてList<Object[]>を望んでいない、あなたはこれを書くことができます。

select new org.sample.RequestResult(u.email, sum(t.moneyPaid), u.address) from Transaction t 
left join t.user u 
group by u.email, u.address; 

オブジェクトを作成しますコンストラクタ文字列の電子メール、ロング(またはその他の、あなたのエンティティのフィールドの型)moneyPaidと10、および文字列

に対処問合せは、あなたが他のだけからなりMapを返すselect new map(...)を書くことができList<RequestResult>

を返します。選択した値のエイリアス

1

これが機能するためには、トランザクションエンティティはuserEmailプロパティを持たず、ManyToOneをUserエンティティに関連付ける必要があります。

hibernate referenceには、関連付けと集約関数について知る必要があるすべてが含まれています。明らかに、SQL集計関数に似ています。

上記のクエリではエンティティが返されませんが、List<Object[]>の各Object[]には、電子メール、支払った金銭の総額、住所の3つの要素が含まれています。リストをループしてAggregatedDataインスタンスのリストを作成するまで

0

結果を照会するのにHQLを使用することを意味しますか? もしそうなら、私はHQLのグループ・バイ・ステートメントがそうすると思います。

select t.userEmail, sum(t.moneyPaid) 
from Transaction t 
group by t.userEmail 

返されるタイプが何であるかわかりません(見つけ出すためにデバッグすることができます)。 しかし、私はList<List<Object>>が動作するかもしれないと思います。

は、ウェブサイト休止状態を参照してください(あなたがそれを使用する前にキャストをダウンしなければならないので、それは弱い、入力される):このクエリで Query with HQL

関連する問題