JPA 条件查询分组依据仅使用 id



这是一个示例实体:

public class Account{
   @Id
   Long id
   Double remaining;
   @ManyToOne
   AccountType type
}
public class AccountType{
   @Id
   Long id;
   String name;
}  

现在我创建一个条件查询,将加入为以下:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createquery();
Root<Account> accountRoot = criteriaQuery.from(Account.class);
Join<Account, AccountType> typeJoin = accountRoot.join(Account_.type);
criteriaQuery.multiSelect(
    typeJoin,
    criteriaBuilder.sum(accountRoot.get(Account_.remaining))
);
criteriaQuery.groupBy(typeJoin);
Query query = getEntityManager().createQuery(criteriaQuery);
query.getResultList();  

上面的代码生成 Sql 命令,如下所示:

select accType.id, accType.name, sum(acc.remaining)
from account acc join accType on acc.accounttype_id = accType.id
group by accType.id  

上面的代码在 PosgreSQL 中工作,但不能在 Oracle 中运行,因为在其中选择未出现在 group by 子句中的 accType.name。

更新
我想我的问题对你来说不清楚。我的问题不是关于PostgreSQL或Oracle在group by的行为。我的问题是这样的:
我在group by子句中使用typeJoin(这意味着我希望休眠使用group by中AccountType的所有字段),但是为什么休眠只在group by上使用身份字段?如果我只在group by中使用标识字段,那么我可以使用以下语句:

criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;

> JPA/Hibernate 不会自动将所有实体属性包含在 group by 子句中,因此您必须手动指定它们:

CriteriaBuilder criteriaBuilder = getEntityManager().getCriteriaBuilder();
CriteriaQuery criteriaQuery = criteriaBuilder.createQuery();
Root<Account> accountRoot = criteriaQuery.from(Account.class);
Join<Account, AccountType> typeJoin = accountRoot.join(Account_.type);
criteriaQuery.multiSelect(
    typeJoin.get("id"),
    typeJoin.get("name"),
    criteriaBuilder.sum(accountRoot.get(Account_.remaining))
);
criteriaQuery.groupBy(typeJoin.get("id"), typeJoin.get("name"));
Query query = getEntityManager().createQuery(criteriaQuery);
query.getResultList();  
如果使用 GROUP BY

,Oracle 要求选择列表中的每列都位于 GROUP BY 中。
PostgreSQL 是相同的,除了按主键分组时,它允许您选择任何列。

来自甲骨文文档

在包含 GROUP BY 子句的查询中,选择 list 可以是聚合函数、GROUP BY 表达式、常量或 涉及其中之一的表达式。

来自PostgreSQL文档

当 GROUP BY 存在或任何聚合函数时,它 对于 SELECT 列表表达式引用未分组无效 列,聚合函数内或未分组列内除外 在功能上依赖于分组列,因为 否则为未分组返回多个可能的值 列。如果分组列(或 其子集)是包含 未分组列。

相关内容

  • 没有找到相关文章

最新更新