java - JPA Criteria query group by 只使用id

标签 java hibernate jpa group-by criteriaquery

这是一个示例实体:

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。

更新:
我想我的问题对你来说不清楚。我的问题不是关于 group by 中的 PostgreSQL 或 Oracle 行为。我的问题是:
我在 group by 子句中使用 typeJoin(这意味着我希望 hibernate 在 group by 中使用 AccountType 的所有字段),但为什么 hibernate 只使用标识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();  

关于java - JPA Criteria query group by 只使用id,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27725770/

相关文章:

java - Hibernate:仅从一张表中选择所有内容,而不是从 3 个连接表中选择所有内容

java - JPQL CASE 语句中的 WHERE 子句问题

java - Java API文档中profile(compact1,compact2,compact 3)的含义是什么?

java - 如何只填充圆角矩形的颜色并将其保存在 Java 中的 var 中

java - 如果方法不保留任何实体,那么制作 TransactionAttributeType.NOT_SUPPORTED 是否好

java - 如何使用 Hibernate 和 Spring Data JPA 正确注释两个实体之间的关系?

java - Hibernate 一对一单向更新

java - Android,SQL 数据库故障 1 语法错误?找不到catlog正在讨论的内容

java - Hibernate Join 使用条件和限制

java - BaseRepository 查询实体列表 返回对象数组列表