【发布时间】:2017-08-24 03:34:11
【问题描述】:
我正在尝试使用 JPA Criteria API 对以下结构进行简单查询
1) 员工
public class Employee {
@Id
@Column(name = "ID", length = 64)
private String id;
@Column(name = "NAME", length = 512)
private String name;
@ManyToOne(optional = true)
@JoinColumn(name = "ORG_ID", nullable = true)
private InternalOrg organization;
}
2) 内部组织
public class InternalOrg {
@Id
@Column(name = "ID", length = 64)
private String id;
@Column(name = "ORGANIZATION", length = 512)
private String organization;
@Column(name = "CODE", length = 64)
private String code;
}
3) 查询
EntityManager em = getEntityManager();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Employee> cq = cb.createQuery(Employee.class);
Root<Employee> emp = cq.from(Employee.class);
cq.where(cb.or(emp.get(Employee_.organization).isNull(),
cb.equal(emp.get(Employee_.organization).get(InternalOrg_.code), "1")));
return em.createQuery(cq).getResultList();
正如您所见,Employee 的“组织”属性是可选的。我要做的是使用标准 API 进行查询,该 API 返回“employee.organization”为 NULL 或“employee.organization.code”等于参数的所有记录。我该如何进行?
我做了一些测试并意识到如果我改变这个:
cq.where(cb.or(emp.get(Employee_.organization).isNull(),
cb.equal(emp.get(Employee_.organization).get(InternalOrg_.code), "1")));
到这里:
cq.where(cb.or(emp.get(Employee_.organization).isNull()));
它有效,但只返回组织为 NULL 的记录。
如果我改成这样:
cq.where(cb.equal(emp.get(Employee_.organization).get(InternalOrg_.code), "1"));
employee.organization 为 NULL 的记录将被忽略。
我如何返回组织满足条件的员工和组织为空的员工?
提前致谢,
【问题讨论】:
-
请添加您的条件查询。
-
你好@ZakiAnwarHamdani,刚刚更新了我的问题,提供了更多细节。