JPQL 查询中的 group by 子句
group by clause in JPQL query
我有一个 JPQL 查询,returns 结果没有聚合
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;
}
如何在此处合并分组?我想要像这样的东西:
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,其中 returns 它的值到我的 table 中。这个聚合列怎么样?
只要给它一个别名,比如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];
}
此外,从查询创建方法中删除(错误的)class 参数:
Query q = em.createQuery(sb.toString())
我有一个 JPQL 查询,returns 结果没有聚合
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;
}
如何在此处合并分组?我想要像这样的东西:
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,其中 returns 它的值到我的 table 中。这个聚合列怎么样?
只要给它一个别名,比如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];
}
此外,从查询创建方法中删除(错误的)class 参数:
Query q = em.createQuery(sb.toString())