JPA离开了联接以查找未使用的条目

wob*_*ogs 7 java sql orm jpa left-join

我确定我是傻瓜,但我似乎无法想出这一个......

我有两张桌子:

部门(做,名字)员工(开斋节,第一,最后,做)

他们有相应的实体JPA管理的entites部门和员工.员工有一个Deparment字段,Department没有维护Employee列表.我想做的是找到所有没有员工的部门.使用普通的旧SQL,左连接很容易:

SELECT d.* 
FROM department as d LEFT OUTER JOIN employee as e
ON d.did = e.did
WHERE e.did IS NULL
Run Code Online (Sandbox Code Playgroud)

我无法看到如何将此查询转换为JPQL.例如,我在JPQL左连接中找到的所有示例都以另一种方式遍历链接.

SELECT e FROM Employee e LEFT JOIN e.departmert d
Run Code Online (Sandbox Code Playgroud)

而我需要更像的东西

SELECT d FROM Department d LEFT JOIN d.???? WHERE e.department IS NULL
Run Code Online (Sandbox Code Playgroud)

但该部门没有保留对其员工的提及(在我的申请中,显然不是部门和员工).这在JPQL中甚至可能吗?

ig0*_*774 9

要执行您要执行的操作,您需要从Departments - > Employees(使用示例实体)设置映射.您可以使用很可能不会破坏您的架构的mappedBy属性@OneToMany,例如,

@Entity
class Department {
    ...
    @OneToMany(mappedBy="employee")
    Collection<Employee> getEmployees() {
        ....
    }
    ...
}
Run Code Online (Sandbox Code Playgroud)

这将允许您运行以下内容:

SELECT d FROM Department d WHERE d.employees IS EMPTY
Run Code Online (Sandbox Code Playgroud)

哪个应该给你相同的结果.

在不改变映射的情况下,您应该能够运行类似此查询的内容以获得所需的结果:

SELECT d from Department d WHERE NOT EXIST (SELECT e FROM Employee e where e.department = d)
Run Code Online (Sandbox Code Playgroud)