当前位置: 首页 > 知识库问答 >
问题:

JPA条件查询组by只使用id

钱星辰
2023-03-14

这是一个示例实体:

public class Account{

   @Id
   Long id
   Double remaining;
   @ManyToOne
   AccountType type
}

public class AccountType{
   @Id
   Long id;
   String name;
}  

现在我创建一个条件查询,将Join作为follwing:

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();  
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中运行,因为它选择的acctype.name没有出现在group by子句中。

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

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

共有1个答案

闾丘京
2023-03-14

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();  
 类似资料:
  • 但是我在遗留系统上有一个具有许多属性的对象,我只想选择几个,尽管我知道选择几个属性通常是很快的。 如果不使用条件查询,这可能吗?

  • 现在我扪心自问,是不是有什么“点符号”或者其他什么东西让这个案例变得可有可无。在E。例如:本机SQL我会做一些事情,比如创建一个子查询,并从内部投影中选择所有别名值()。 如果有任何建议,我将不胜感激。

  • 我试图将一个独立的产品集成到LDAP环境中。 是否有一种方法可以让getgrnam和getpwnam只查询本地系统,而不必在运行脚本时重新配置nsswitch.conf并可能停止/启动SSSD? 是否有另一个perl函数可以用来只查询本地用户/组?

  • 问题内容: JPA条件查询是否可以在 课堂 上订购?想象以下域对象: 使用常规QL,我能够做到 但是,当我对条件查询应用相同的逻辑时,会发生运行时异常“未知属性”。 使用的JPA实现:Hibernate-EntityManager v3.5.5-Final 问题答案: JPA 2.0引入了一个新表达式,该表达式允许查询根据类类型限制结果。 您可以使用通过Criteria API使用类型表达式。因此

  • 如何创建高效的 JPA 条件查询,以便仅当实体存在于联接表中时才选择实体列表?例如,采用以下三个表: 有问题的查询(我希望 JPA 生成什么)是: 以下条件查询将产生类似的结果,但有两个连接: 根本问题似乎是我对USER_WORKGROUP连接表使用@JoinTable注释,而不是对连接表使用单独的@Entity,所以我似乎不能在条件查询中将USER_WORGGroup用作根。 以下是实体类:

  • 假设我有一个MongoDB集合,其中包含以下信息: 我想计算按州分组的订单总价的总和,其中项目为“苹果”,颜色为“红色”。我的问题是: 但是,我希望能够将我的结果cust\u id包含在\u id中,它是一个数组/映射/一些结构,其中包含构成我的合计的所有客户id的列表。因此,我希望我的输出包含 是否有办法处理此mongo聚合/查询?或者是一种更好的方式来构造此查询,以便我可以按州分组计算红苹果的