【发布时间】:2015-02-27 19:37:15
【问题描述】:
这是一个示例实体:
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(这意味着我希望休眠使用group by 中的所有AccountType 字段),但是为什么休眠只在group by 上使用身份字段?如果我只使用group by 中的标识字段,那么我可以使用以下语句:
criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;
【问题讨论】:
标签: java hibernate jpa group-by criteriaquery