私の同僚は、次の (明らかに無効な) JPQL クエリを持っています。
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')
DonationAllocation
とエンティティとの関係Campaign
は多対 1 であり、 としてマークされていることに注意してください (このメッセージの後半で説明します) FetchType.LAZY
。このクエリに対する私の同僚の意図は、(とりわけ)a.campaign
「インフレ」(熱心にフェッチされる)であることを確認することです。
Hibernate (明らかに、いくつかの JPA 実装の 1 つにすぎません) は、このクエリに直面すると、次のように述べています。
query specified join fetching, but the owner of the fetched association was not present in the select list
NEW DonationAllocationDTOEntity()
選択リストには のみが含まれており、JPA 2.0 仕様のセクション 4.4.5.3 には次のように記載されているため、これは理にかなっています。
FETCH JOIN 句の右側で参照される関連付けは、クエリの結果として返されるエンティティまたは埋め込み可能オブジェクトから参照される関連付けまたは要素のコレクションである必要があります。
したがって、「クエリの結果として返されるエンティティまたは埋め込み可能」(NEW
演算子を使用して構築された DTO です) がないため、FETCH JOIN が参照する可能性のある関連付けがないため、このクエリは無効です。 .
この制限が与えられた場合a.campaign
、コンストラクター式に渡されて熱心にフェッチされるように、この場合、どのように JPQL クエリを作成する必要がありますか?