2017-11-25 43 views
0

我想要一些幫助,試圖做到以下幾點。我想要得到每個用戶在數據庫中按他的名字和id分組的購買次數。但它是非常與簡單的sql相比很難做到。春天的數據JPA,結果對象有數字而不是列名

我在PurchaseRepository下面的代碼擴展的所有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(); 

首先不知道這是正確的查詢,因爲我想要做COUNT(*),但表示,其無效。

其次,當通過控制器轉化成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)結果

查詢的結果是列表,如果你想有一些有意義的事情,你應該考慮的構造函數表達式,它可以讓你創建自己的對象。

例如

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的名單,我應該做一個 選擇新的List <新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(),如果你期望不止一個Query.getResultList() –

+0

謝謝,你爲我節省了很多關鍵時間,我會隨機試驗。 – rexxar2