2010-08-04 5 views
7

jestem pewien, że jestem głupi, ale nie wydają się rysunek to jedno ...JPA lewej przyłączyć znaleźć nieużywane wpisy

Mam dwie tabele:

działem (nie, imię i nazwisko) pracownik (eid, pierwszy, ostatni, zrobił)

mają odpowiednie podmioty W JPA zarządza Departament i pracownik. Pracownik ma pole Deparment, Departament nie prowadzi listy Pracowników. Co chcę zrobić, to znaleźć wszystkie departamenty, które nie mają pracowników. Używając zwykłego starego SQL, jest to łatwe z lewym złączeniem:

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

Nie widzę jednak tłumaczenia tego zapytania na język JPQL. Wszystkie przykłady, które znalazłem dla lewych złączek JPQL, przechodzą na przykład przez łącze.

SELECT e FROM Employee e LEFT JOIN e.departmert d 

Podczas gdy muszę coś bardziej jak

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

ale dział nie utrzymuje odniesienie do jego pracowników (w mojej aplikacji nie jest oczywiście wydziałów i pracowników). Czy jest to możliwe nawet w JPQL?

Odpowiedz

9

Aby wykonać to, co próbujesz zrobić, musisz skonfigurować mapowanie z działu -> Pracownicy (używając swoich przykładowych elementów). Można stosować atrybut mappedBy z @OneToMany, która najprawdopodobniej nie zakłóci Twojego schematu, np

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

Pozwoliłoby to na uruchomienie coś takiego:

SELECT d FROM Department d WHERE d.employees IS EMPTY 

Które powinny dać równoważne wyniki.

Bez zmieniając swoje odwzorowanie, powinieneś być w stanie uruchomić coś w rodzaju tego zapytania, aby uzyskać pożądane wyniki:

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

Brilliant, doskonała odpowiedź dzięki. Poszedłem do kwerendy zamiast konfigurowania mapowania. Jestem pewien, że zapytanie nie jest bardzo wydajne, ale nie będzie się nadawać zbyt często. – wobblycogs

+0

Czy "IS EMPTY" powinno być używane również wtedy, gdy przedmiot nie jest zbiorem, ale jest tylko jednostką OneToOne z mapowanym plikiem? edit: tak, działa. – Amalgovinus