Ein Kollege von mir die folgenden (scheinbar ungültig) JPQL Abfrage hat: (in dieser Nachricht für später)In JPA 2.0 JPQL, wenn man ein neues Objekt zurückgibt, wie kann man FETCH JOINs nutzen?
SELECT NEW com.foobar.jpa.DonationAllocationDTOEntity(a.id, a.campaign, a.campAppeal, a.campDivision, a.divisionFund)
FROM DonationAllocation a JOIN a.donation d JOIN a.allocationType t
JOIN FETCH a.campaign
WHERE d.id = :donationId
AND (t.code = 'Pledge' OR t.code = 'MatchingPledge')
Es ist erwähnenswert, dass mit einer Campaign
Einheit DonationAllocation
‚s Beziehung viele-zu-eins ist, und ist als FetchType.LAZY
markiert. Mit dieser Abfrage will mein Kollege unter anderem sicherstellen, dass a.campaign
"aufgeblasen" wird (eifrig abgerufen).
Hibernate (natürlich nur eine JPA-Implementierung mehrerer), wenn sie mit dieser Abfrage konfrontiert, sagt:
query specified join fetching, but the owner of the fetched association was not present in the select list
Dies macht Sinn, da die Auswahlliste nur NEW DonationAllocationDTOEntity()
enthält, und Abschnitt 4.4.5.3 der JPA 2.0 Spezifikation sagt:
Die Assoziation referenziert durch die rechte Seite der FETCH JOIN-Klausel muss Eine Assoziation oder Elementsammlung sein, auf die von einer Entität oder einer eingebetteten Entität verwiesen wird, die als Ergebnis der Abfrage zurückgegeben wird.
So, da es keine „Organisation oder integrierbare, die als Ergebnis der Abfrage zurückgegeben wird“ (es ist ein DTO konstruiert mit dem NEW
Operator), folgt daraus, dass es keine mögliche Verbindung ist für ein FETCH JOIN zu referenzieren und daher ist diese Abfrage ungültig.
Wie, angesichts dieser Einschränkung, sollte man in diesem Fall eine JPQL-Abfrage konstruieren, so dass a.campaign
- in den Konstruktor-Ausdruck übergeben - eifrig abgerufen wird?
Vielen Dank. 'DonationAllocation' ist derzeit ein * riesiges * Objekt mit viel zu vielen' EAGER'-Beziehungen. Ich glaube, mein Kollege versucht nur bestimmte Teile davon zurückzuziehen. Es ist einfach so, dass eine dieser Beziehungen, die er * wirklich will, in dieser Frage eifrig geladen werden soll. Mit diesem neuen Wissen, würde das deine Antwort ändern? –
Ja, sehe meine Antwort. Aber wenn das Laden der Entität ein solches Problem ist, bedeutet es nur, dass seine begierigen Assoziationen faul gemacht werden sollten. Ich ziehe es vor, alles faul zu machen. –