我想要一些帮助尝试执行以下操作。我想获得按照他的名字和id分组的数据库中每个用户的购买数量。但与简单的sql相比,它很难做到。
我的PurchaseRepository中有以下代码,用于扩展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:{
....
}
有什么想法吗?
答案 0 :(得分: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)结果
查询的结果是List,如果你想要有意义的东西你应该考虑构造函数表达式,让你创建自己的对象。
例如
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
}
然后可以在查询中使用此类(请在NEW之后注意完全限定的类名称):
SELECT NEW mypackage.PurchaseInfo(p.user.name, p.user.id, Count(p))
from Transaction p GROUP BY p.user.name, p.user.id
结果将是List,您将很好地序列化为JSON。
在此处阅读有关构造函数表达式的更多信息:
https://vladmihalcea.com/the-best-way-to-map-a-projection-query-to-a-dto-with-jpa-and-hibernate/