以下是我的例子:
部门实体
@Entity
@Table(name = "DEPART_TABLE")
public class Department {
@Id
@Column(name = "ID")
private Long departmentId;
@Column(name = "NAME")
private String departmentName;
@Column(name = "POST_NO")
private String postNumber;
@OneToMany(cascade = CascadeType.ALL, mappedBy = "department")
private List<Employee> employees;
// getters/setters
}
员工实体
@Entity
@Table(name = "EMPL_TABLE")
public class Employee {
@Id
@Column(name = "USER_NO")
private String userNumber;
@Column(name = "NAME")
private String name;
@Column(name = "EMAIL")
private String email;
@ManyToOne
@JoinColumn(name = "DEP_ID")
private Department department;
// getters/setters
}
基本上,我有一个有员工名单的部门。在某些时候,我需要find
只有userNumber
的部门。这项服务看起来像:
public Department getDepartment(String userNumber) {
//JPQL query here to find a department by employee.userName
}
这两个实体之间存在关系,因此最简单的方法可能是entityManager.find(Employee.class, userNumber)
,之后只需在返回的实体上调用employee.getDepartment()
。这很好。
但还有其他办法吗?看起来可以使用EclipseLink MEMBER OF
:
SELECT d FROM Department d WHERE '<????>' MEMBER OF d.employees
是否可以使用此运算符或JOIN
之类的其他内容创建JPQL查询以查找我需要的部门?
答案 0 :(得分:1)
您不需要JOIN
或MEMBER
,因为Department
是Employee
的直接字段。你只是有点错误的方面。这样做:
String query =
"SELECT e.department FROM Employee e WHERE e.userNumber=:userNumber";
并使用如:
TypedQuery<Department> tq = em.createQuery(query, Department.class);
Department d = tq.setParameter("userNumber", "2401").getSingleResult();
更新:只是为了强调传递的参数应该与比较的值相对应 - 所以MEMBER OF
需要一个Employee
实体,你不能轻易地扭转userNumber
- 并展示它是如何实现的会继续(并注意到这些查询有点暗淡,不能以这种方式使用......):
<强>合并强>
String query = " SELECT d FROM Department d, Employee e "
+ " WHERE e.userNumber=:userNumber AND e MEMBER OF d.employees ";
MERGE + JOIN
String query = " SELECT d FROM Department d JOIN d.employees e "
+ "WHERE e.userNumber=:userNumber AND e MEMBER OF d.employees ";