使用MEMBER OF运算符的EclipseLink JPQL查询

时间:2018-02-22 08:09:46

标签: jpa eclipselink jpql

以下是我的例子:

部门实体

@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查询以查找我需要的部门?

1 个答案:

答案 0 :(得分:1)

您不需要JOINMEMBER,因为DepartmentEmployee的直接字段。你只是有点错误的方面。这样做:

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 ";