Spring Data JPA-Spezifikation unter Verwendung von CriteriaBuilder mit einer Eins-zu-Viele-Beziehung

8

Ich habe eine User -Entität, eine UserToApplication -Entität und eine Application -Entität.

Ein einzelnes User kann auf mehr als ein Application zugreifen. Und ein einzelnes Application kann von mehr als einem User verwendet werden.

Hier ist die Entität User .

%Vor%

Hier ist die Entität UserToApplication .

%Vor%

Und hier ist die Entität Application .

%Vor%

Ich habe das folgende Specification , das ich verwende, um nach einem User by firstNm , lastNm und email zu suchen.

%Vor%

Und hier ist das User_ Metamodell, das ich bisher habe.

%Vor%

Nun möchte ich auch eine Liste von Anwendungs-IDs an die Specification übergeben, so dass ihre Methodensignatur lauten würde:

%Vor%

Also, meine Frage ist, kann ich das @OneToMany Mapping zum User_ Metamodell für das Collection<Application> applications Feld meiner User Entität hinzufügen, und wie würde ich dann in Specification ?

Meine aktuelle Specification wäre ähnlich der folgenden SQL-Abfrage:

%Vor%

Und was ich in der neuen Specification erreichen möchte, wäre etwa so:

%Vor%

Ist es möglich, diese Art von Mapping im Metamodell durchzuführen, und wie könnte ich dieses Ergebnis in meinem Specification ?

erreichen?     
Andrew Mairose 30.09.2015, 19:45
quelle

1 Antwort

11

Ich habe eine Lösung gefunden. Um ein Eins-zu-viele-Attribut zuzuordnen, habe ich im Metamodell folgendes hinzugefügt:

%Vor%

Ich musste auch ein Metamodell für die Entität Application hinzufügen.

%Vor%

Dann könnte ich in meinem Specification auf den applications für einen Benutzer zugreifen, indem ich die Methode .join() für die Instanz Root<User> verwende. Hier ist das Predicate Ich bildete.

%Vor%

Es ist auch erwähnenswert, dass mein Specification , wie es in der Frage geschrieben ist, nicht funktioniert, wenn einer der Eingabewerte leer ist. Eine Null Predicate , die an die .and() -Methode von CriteriaBuilder übergeben wurde, verursacht NullPointerException . Also habe ich ein ArrayList vom Typ Predicate erstellt und dann jedes Predicate zur Liste hinzugefügt, wenn der entsprechende Parameter nicht leer war. Schließlich konvertiere ich das ArrayList in ein Array, um es an die Funktion .and() von CriteriaBuilder zu übergeben. Hier ist das letzte Specification :

%Vor%     
Andrew Mairose 02.10.2015, 19:56
quelle