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

时间:2017-11-25 13:45:48

标签: json spring object jpa names

我想要一些帮助尝试执行以下操作。我想获得按照他的名字和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:{
....
}

有什么想法吗?

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/