JPA JPQL-Abfrage

rmacher

Mitglied
Hallo allerseits

Habe folgende Ausgangslage:

Java:
class Aufgabe {
    
   @OneToOne
    private Person person;

    // ...
    
}

class Person {
    // ...
}

Ich habe in der DB Aufgaben und Personen abgelegt. Eine Aufgabe kann eine Person enthalten, muss aber nicht (person ist nullable). Jetzt muss ich alle Pesonen holen, die noch keine Aufgabe erhalten haben.

Einfacher Ansatz:

  • Alle Personen holen: personListe
  • Alle Aufgaben hollen: aufgabeListe
  • Durch alle Aufgaben iterieren und sehen, ob da eine Person enthalten ist oder nicht. Falls ja, wird diese Person aus der personListe entfernt.

Am Schluss habe ich die Perosnen, die noch keine Aufgabe haben.

Nun, dass würde ich gerne der DB überlassen, komme aber mit JPQL nicht so weit.

Wie könnte eine JPQL-Abfrage aussehen, mit der ich alle Personen, die noch keine Aufgabe haben, in einer Liste holen kann?

Danke.
 

stg

Top Contributor
Die passende JPQL Abfrage dazu lautet ganz schlicht

@NamedQuery(name="Person.findKeineAufgabe", query="select p from Person p where p.aufgabe IS NULL")

Dazu brauchst du natürlich noch die Navigationsmöglichkeit in die andere Richtung. Person sollte also ein Feld vom Typ 'Aufgabe' besitzen. Wenn das nicht klappt, dann stimmt etwas mit deinem Mapping nicht, das ist hier aber nicht wirklich ersichtlich. Wie Biderectionales Mapping in JPA ausschaut, kannst du aber ja in der passenden Doku oder auch allen Einsteigertutorials zum Thema nachlesen.
 

rmacher

Mitglied
Vielen Dank für die Antwort.

Das Mapping ist leider unidirektional, ändern kann man es halt nicht mehr.

Ich frage mich, ob es möglich wäre, die "Schleife" aus dem Code auf dem DBMS ausführen zu lassen:

- Alle Personen holen, die in irgendeiner Aufgabe referenziert werden --> personAusAufgabeListe
- Alle Personen hollen, die nicht in personAusAufgabeListe enthalten sind

Ich könnte es mir vorstellen, dass so was auf dem DBMS um einiges performanter wäre, alls wenn ich das Filtern in meinem Code mache.
 

Ähnliche Java Themen


Oben