2017-11-25 13 views
0

私は次のことをしようとしています。彼の名前とIDでグループ化されたデータベース内の各ユーザの購入数を取得したいと思います。単純なSQLと比較するのは難しいです。SpringデータJPA、結果オブジェクトにカラム名の代わりに数字がある

は、私は私がCOUNT(*)をやってみたかったが、その有効でないと言うので、これは右のクエリがあるかどうかわからないすべてのIM CrudRepository

@Query("SELECT p.user.name as Name,p.user.id as Id,Count(p) as Purchases from Transaction p GROUP BY p.user.id") 
List<Object> purchaseNumOfEachUser(); 

ファーストを拡張して、私のPurchaseRepositoryに次のコードを持っています。

は第二に、コントローラを介してJSONに変換したときに、私が返されますオブジェクトは、私が取得したいと思い何

0:{ 
0:"John", 
1:2, //id 
2:5 //purchases 
} 

のようなものであることは

0:{ 
"Name" : "John", 
"Id" : 1 , 
"Purchases" : 2 
}, 
1:{ 
.... 
} 

任意のアイデアですか?

答えて

1

1)クエリ:

SELECT p.user.name as Name, p.user.id as Id, Count(p) as Purchases 
from Transaction p GROUP BY p.user.id 

は、あなたが選択されているすべての行でグループ

SELECT p.user.name as Name, p.user.id as Id, Count(p) as Purchases 
from Transaction p GROUP BY p.user.name, p.user.id 

必要がありますする必要があります。

2)結果

は、クエリの結果は、あなたが何か意味を持たせたい場合は、あなたがあなた自身のオブジェクトを作成してみましょうコンストラクタ式を考慮すべきであるリストです。

このクラスは、(NEW後に完全修飾クラス名を何卒ご了承下さい)クエリで使用することができます

package mypackage; 

public class PurchaseInfo { 

    private final String name; 
    private final Integer id; 
    private final Long count; 

    public PurchaseInfo(String name, Integer id, Long count) { 
    this.name = name; 
    this.id = id; 
    this.cound = count; 
    } 
    // getters 
} 

例えば:

SELECT NEW mypackage.PurchaseInfo(p.user.name, p.user.id, Count(p)) 
from Transaction p GROUP BY p.user.name, p.user.id 

結果は、リストされ、あなたがしますJSONにうまくシリアル化されています。

ここコンストラクタ式について詳しく読む:

https://vladmihalcea.com/the-best-way-to-map-a-projection-query-to-a-dto-with-jpa-and-hibernate/

+0

クエリがpurchaseInfo代わりのシングルpurchaseInfoのリストを返すことが期待されているのであれば、私は SELECT新しいリストを行う必要があります。<新しいmypackageとを.PurchaseInfo(p.user.name、p.user.id、Count(p))>トランザクションpの GROUP BY p.user.name、p.user.id List purchaseNumOfEachUsers? – rexxar2

+1

いいえ! Query.getSingleResult()を呼び出す結果が1つだけで、複数のQuery.getResultList()が必要な場合は –

+0

ありがとうございました。私は無作為に実験している非常に多くの時間を節約しました。 – rexxar2

関連する問題