【问题标题】:Spring data JPA , result object has numbers instead of column namesSpring data JPA,结果对象有数字而不是列名
【发布时间】:2017-11-25 13:45:48
【问题描述】:

我需要一些帮助来尝试执行以下操作。我想获取数据库中按他的姓名和 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:{
....
}

有什么想法吗?

【问题讨论】:

    标签: json spring object jpa names


    【解决方案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/

    【讨论】:

    • 因此,如果查询预计返回 purchaseInfo 列表而不是 Single purchaseInfo ,我应该执行 SELECT NEW List from Transaction p GROUP BY p.user.name, p.user.id List purchaseNumOfEachUsers?
    • 不!如果您期望只有一个结果,请调用 Query.getSingleResult() 并且如果您期望多个 Query.getResultList()
    • 谢谢你,你为我节省了很多关键时间,我会随机试验。
    猜你喜欢
    • 2019-08-21
    • 2018-08-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-08-29
    • 2014-12-29
    • 2018-11-25
    相关资源
    最近更新 更多