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:
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.