2016-09-10 2 views
0

Ich habe die folgende Abfrage in meinem Repository:Frühling Daten JPA LEFT JOIN holen und wo Klausel

SELECT p FROM Project p JOIN p.users u WHERE u.login =:login 

Es gibt eine viele zu viele relationshio zwischen Benutzer und Projekt. Alles funktioniert gut und es gibt die Projekte des Benutzers zurück, aber ich möchte, dass es für jedes Projekt die entsprechenden Benutzer zurückgibt.

UPDATE: Versucht das folgende als mateuszlo vorgeschlagen:

SELECT p FROM Project p JOIN FECTH p.users JOIN p.users u WHERE u.login =:login 

Aber jetzt habe ich die folgende Ausnahme:

nested exception is java.lang.IllegalArgumentException: Count query validation failed for method public abstract org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLo‌​gin(java.lang.String‌​,org.springframework‌​.data.domain.Pageabl‌​e)! org.hibernate.QueryException: query specified join fetching, but the owner of the fetched association was not present in the select list 

Antwort

1

Es ist unmöglich, einen Namen Alias ​​erstellen für eine Abfrage FETCH JOIN zu verwenden es in einer WHERE Aussage. JPA erlaubt dies nicht absichtlich, weil es leicht zu unerwünschten Situationen führen könnte.

Betrachten Sie eine Project X, die 3 Users hat: John, Tom und Mike. Abfrage mit FETCH JOIN für Projekte, bei denen Benutzer John Project X mit nur einem User - John zurückgeben würde. Das würde eine unvollständige Project Entität erzeugen, die mit dem aktuellen Datenbankstatus nicht übereinstimmt.

Also, was Sie tun müssen, ist zweimal beizutreten. Zum ersten Mal mit normalen JOIN, richtigen Projet Datensätze zu identifizieren, und die zweite Mal dann mit FETCH JOIN zu holen correspoding Users:

SELECT p FROM Project p 
JOIN FETCH p.users 
JOIN p.users u WHERE u.login =:login 
+0

Dank mateuszlo. Habe es bereits ausprobiert, habe aber die folgende Ausnahme: verschachtelte Ausnahme ist java.lang.IllegalArgumentException: Die Abfrage der Anzahl der Abfragen ist für die Methode public abstrakt fehlgeschlagen org.springframework.data.domain.Page com.example.app.repository.ProjectRepository.findAllByUserLogin (java.lang .String, org.springframework.data.domain.Pageable)! org.hibernate.QueryException: Abfrage angegebenen Join-Abruf, aber der Besitzer der abgerufenen Zuordnung war nicht in der Auswahlliste vorhanden –