JPA JPQL-Abfrage

Dieses Thema JPA - JPQL-Abfrage im Forum "Data Tier" wurde erstellt von rmacher, 12. Sep. 2014.

Thema: JPQL-Abfrage Hallo allerseits Habe folgende Ausgangslage: class Aufgabe { @OneToOne private Person person;...

  1. Hallo allerseits

    Habe folgende Ausgangslage:

    Code (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.
     
  2. Vielleicht hilft dir das Grundlagen Training weiter --> *Klick*
  3. stg
    stg
    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.
     
  4. 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.
     
  5. Kostenloses Java-Grundlagen Training im Wert von 39 €
    Schau dir jetzt hier das Tutorial an und starte richtig durch!