【发布时间】:2020-12-16 20:18:03
【问题描述】:
我想知道如何使用JPA Criteria API通过相关实体的外键过滤实体。
假设我有两个实体如下:
public class Employee {
@Id
private Long id;
...
@ManyToOne
private Department department;
...
}
public class Department {
@Id
private Long id;
}
我要查询id为(1,2,3)的部门下的员工。
我能够使用 Hibernate 的废弃标准来做到这一点,并且想知道如何使用 JPA 标准谓词 without join (root.join) 来做到这一点。我不需要任何连接或子查询是合乎逻辑的,因为可以从一个表中获取所需的结果:
select e.* from employee e where e.department_id in (1,2,3)
** 更新**
我的问题是 - 作为 JPA Criteria 的新功能,并且来自已弃用的 Hibernate Criteria - 我使用了 CriteriaBuilder 中的所有 API,例如 (equal, notEqual, isNull, like, .....);因此,使用了CriteriaBuilder.In(experssion).in(values)。
但是,正如@frank 的回答所示,我发现对于IN 用法,我将使用Root.get(<attr>).in(<values>)
CriteriaBuilder.in 也可以使用,但不同:
In<Object> inClause = criteriaBuilder.in(root.get(<attr>);
for (Long id : ids) {
inClause.value(id);
}
但是,当然,第一个解决方案更容易。
【问题讨论】:
标签: java hibernate jpa jpa-2.2