【问题标题】:group by clause in JPQL queryJPQL 查询中的 group by 子句
【发布时间】:2015-10-23 00:32:08
【问题描述】:

我有一个 JPQL 查询,它返回没有聚合的结果

public List<Transaction> getProjTransactionsByParametersId(Long id){
        StringBuilder sb = new StringBuilder("FROM Transaction AS t WHERE t.account.id = :id and status = 0");

        Query q = em.createQuery(sb.toString(), Transaction.class)
                .setParameter("id", id);

        List<Transaction> projTransactions = q.getResultList();

        return projTransactions;
    }

如何在此处合并 group by?我想要类似的东西:

public List<Transaction> getProjTransactionsByParametersId(Long id){
        StringBuilder sb = new StringBuilder("SELECT sum(t.amount), t.valueDate FROM Transaction AS t WHERE t.account.id = :id and status = 0 GROUP BY t.valueDate");

        Query q = em.createQuery(sb.toString(), Transaction.class)
                .setParameter("id", id);

        List<Transaction> projTransactions = q.getResultList();

        return projTransactions;
    }

在这种情况下,我是否必须在 Transaction 映射中为 sum 聚合创建一些新字段?我读过其他来源的文献,但我不懂逻辑。

例如,对于映射中的 valueDate,我有 getter,它将其值返回到我的表中。这个聚合列呢?

【问题讨论】:

    标签: hibernate jpa hibernate-mapping jpql


    【解决方案1】:

    只需给它一个别名,例如sum(t.amount) as amountSum。然后从数组列表中读取读取值(或使用其他类似的alternatives):

    List<Object[]> projTransactions = q.getResultList();
    for (Object[] objects : projTransactions) {
       Number amountSum = (Number) objects[0]; // Use appropriate data type
       Date valueDate = (Date) objects[1];
    }
    

    另外,从查询创建方法中删除(错误的)类参数:

    Query q = em.createQuery(sb.toString())

    【讨论】:

    • 这里抛出异常,Query q = em.createQuery(sb.toString())
    • 什么是堆栈跟踪? PS我编辑了我的答案以指出在这种情况下您不需要 class 参数。
    • 正是我需要的。我是由于那个班级的一部分。谢谢
    猜你喜欢
    • 2018-09-07
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-07-28
    • 2016-05-09
    • 2017-08-25
    • 2016-05-01
    • 2014-03-02
    相关资源
    最近更新 更多