这是一个示例实体:
public class Account{
@Id
Long id
Double remaining;
@ManyToOne
AccountType type
}
public class AccountType{
@Id
Long id;
String name;
}
现在我使用 Join 创建一个条件查询,如下所示:
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
. 我的问题是:
我使用typeJoin
ingroup by
子句(这意味着我希望休眠使用 AccountType in 的所有字段group by
),但为什么休眠只使用身份字段group by
?如果我只使用身份字段,group by
那么我可以使用以下语句:
criteriaQuery.groupBy(typeJoin.get(AccountType_.id)) ;