Spring 数据 JPA,结果对象有数字而不是列名

Spring data JPA , result object has numbers instead of column names

我想要一些帮助来尝试做 following.I 想获得数据库中每个用户的购买数量按他的名字分组 id.But 与简单相比很难做到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:{
....
}

有什么想法吗?

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
}

然后可以在查询中使用此 class(请注意 NEW 后的完全限定 class 名称):

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/