2016-06-02 9 views
1

Diese JPQL Abfrage:Wie kann ein Pfadausdruck, der zu einem linken Join in JPA führt, ausgeführt werden?

select p from Post p where p.status = 'public' or p.author.name = 'John' 

entspricht einem join zwischen post und author, so dass er vermisst alle Datensätze, die öffentlich sind (status = 'public'), die keinen Autor hat (author = null).

Gibt es eine Möglichkeit, dies in einen linken Join zu konvertieren, ohne eine explizite linke Join-Klausel zum "von" -Teil hinzuzufügen?

Ich kann keine explizite links trete auf „aus“ Teil wie folgt aus:

select p from Post p left join p.author a where p.status = 'public' or a.name = 'John' 

Da der Code, der die p.author.name = 'John' Klausel erzeugt keine Möglichkeit hat, eine neue Beziehung zu dem „von“ hinzufügen Teil.

Also, dieser Teil statisch ist, kann ich nur anfügen Klauseln es:

select p from Post p where p.status = 'public' 
+0

beschrieben bedeutet, wie explizit "LEFT OUTER JOIN p.author" im FROM-Teil der Abfrage sagen? Jede JPQL-Dokumentation würde zeigen, wie das geht. –

+0

Ich bin auf der Suche nach einer Möglichkeit, eine linke Join zu tun, ohne es explizit im Teil der Abfrage zu sagen. Ich habe die Frage zur Klärung bearbeitet. –

+1

können Sie nicht. Dafür ist die FROM-Klausel zuständig. Putting Zeug in der WHERE wird bekommen, was der JPA-Anbieter gibt Ihnen .. –

Antwort

0

Dies kann nicht in JPQL getan werden, und wenn Sie eine Unterabfrage verwenden, könnte die Verbindung in der inneren Abfrage zu vermeiden, I Ich weiß nicht, wie es in @AdditionalCriteria funktionieren würde.

Wenn Sie einen Outer-Join in zusätzlichen Kriterien hinzufügen müssen, müssen Sie die systemeigene EclipseLink-API verwenden und einen Outerjoin-Ausdruck über einen Deskriptor-Customizer festlegen. Diese blog gibt ein Beispiel, während EclipseLinks Expression-Framework Outer-Joins mit dem getAllowingNull wie in der Dokumentation here