2017-11-25 44 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