JPA оставил соединение, чтобы найти неиспользуемые записи - PullRequest
7 голосов
/ 04 августа 2010

Я уверен, что я глуп, но я не могу понять это ...

У меня есть две таблицы:

отдел (сделал, имя) сотрудник (Ид, первый, последний, сделал)

у них есть соответствующие юридические лица, которыми JPA управляет, Департамент и Сотрудник. У сотрудника есть поле Deparment, отдел не ведет список сотрудников. Однако я хочу найти все департаменты, в которых нет сотрудников. При использовании простого старого SQL это легко с левым соединением:

SELECT d.* 
FROM department as d LEFT OUTER JOIN employee as e
ON d.did = e.did
WHERE e.did IS NULL

Хотя я не вижу, как перевести этот запрос в JPQL. Все примеры, которые я нашел для левых соединений JPQL, пересекают ссылку, например.

SELECT e FROM Employee e LEFT JOIN e.departmert d

В то время как мне нужно что-то более похожее

SELECT d FROM Department d LEFT JOIN d.???? WHERE e.department IS NULL

но департамент не поддерживает ссылки на своих сотрудников (в моем приложении это, конечно, не департаменты и сотрудники). Возможно ли это даже в JPQL?

1 Ответ

9 голосов
/ 04 августа 2010

Чтобы сделать то, что вы пытаетесь сделать, вам нужно настроить отображение из Отделов -> Сотрудники (используя ваши примеры сущностей).Вы можете использовать атрибут mappedBy @OneToMany, который, скорее всего, не нарушит вашу схему, например,

@Entity
class Department {
    ...
    @OneToMany(mappedBy="employee")
    Collection<Employee> getEmployees() {
        ....
    }
    ...
}

Это позволит вам выполнить что-то вроде:

SELECT d FROM Department d WHERE d.employees IS EMPTY

Что должно дать вам эквивалентные результаты.

Не изменяя свое отображение, вы сможете выполнить что-то вроде этого запроса, чтобы получить нужные результаты:

SELECT d from Department d WHERE NOT EXIST (SELECT e FROM Employee e where e.department = d)
...