Polymorphe where-Klausel, die QueryDsl verwendet

9

Ich versuche, QueryDsl zu verwenden, um eine Abfrage mit einer polymorphen where-Klausel zu schreiben.

Da es etwas schwierig ist zu erklären, was ich im Abstract machen möchte, klonte das Spring-Boot-Sample-Daten-JPA-Projekt und änderte es, um ein Beispiel zu zeigen, was ich versuche zu tun.

Ich habe diese Modellklassen , wo Sie feststellen, dass SpaHotel und SportHotel die Entität Hotel erweitern.

Ich versuche, eine Abfrage zu schreiben, die alle Städte zurückgibt, die entweder ein SpaHotel oder ein SportHotel enthalten, dessen Hauptsport vom gegebenen Typ ist.

Ich schrieb eine JPQL-Version dieser Abfrage , die ein wenig hässlich ist (ich mag den sport is null -Teil nicht, um anzuzeigen, dass es ein Spa ist Hotel), scheint aber zurückzukehren, was ich will.

Aber Die QueryDsl-Version dieser Abfrage scheint nicht zu funktionieren:

%Vor%

Mein test schlägt fehl mit:

%Vor%

Es scheint so, als ob meine Anfrage nicht "Montreal" zurückgibt, was zurückgegeben werden sollte, da es ein SpaHotel enthält.

Ich frage mich auch, ob es normal ist, dass QueryDsl meine Anfrage in einen Cross-Join übersetzt:

%Vor%

Meine Fragen:

  1. Warum gibt diese Abfrage nicht "Montreal" zurück, das a enthält SpaHotel?
  2. Gibt es eine bessere Möglichkeit, diese Abfrage zu schreiben?
  3. Ist es normal, dass das generierte SQL einen Cross-Join durchführt? Können wir nicht, wie in JPQL, einen Linksbündel erstellen?
Etienne Neveu 26.03.2015, 11:18
quelle

1 Antwort

3

Die korrekte Umwandlung Ihrer JPQL-Abfrage

%Vor%

ist

%Vor%

In Ihrer ursprünglichen Abfrage diese Eigenschaft Verwendung

%Vor%

bewirkt, dass die Querverknüpfung und die Abfrage an SportHotels gebunden werden.

Querydsl verwendet implizite Links-Joins nur für Pfade, die nur in der Reihenfolge verwendet werden. Bei einem Teil der Abfrage führt alles zu impliziten inneren Joins.

    
Timo Westkämper 27.03.2015, 19:55
quelle

Tags und Links