【发布时间】:2012-06-25 05:48:57
【问题描述】:
我的一位同事有以下(显然无效)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 实体的关系是多对一的,并被标记为FetchType.LAZY。我的同事对此查询的意图是(除其他外)确保a.campaign 是“膨胀的”(急切地获取)。
Hibernate(显然只是几个 JPA 实现中的一个),当面对这个查询时,会说:
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 没有可能的关联来引用,因此这个查询是无效的。
鉴于此限制,在这种情况下,应该如何构造一个 JPQL 查询,以使a.campaign——传递到构造函数表达式中——被急切地获取?
【问题讨论】: