这是一个示例实体:
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)) ;
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用作根。 以下是实体类:
现在我需要正在学习‘程序设计’课程的学生名单 如何使用条件查询实现这一点。