我在一个非常简单的项目中使用EclipseLink(2.4,2.5和2.6),我有一个Department
实体,每个Department
链接到一个Employee
实体manager
1 {} Department
。
我目前无法使这个简单的查询工作:
select d from Department d where d.manager is null
返回1行
select d from Department d left join fetch d.manager where d.manager is null
返回0行
我在H2数据库上使用Eclipselink。生成的SQL查询似乎不会创建左连接,而是内连接,显然会失败。
SELECT t1.ID, t1.MANAGER_ID, t0.ID, t0.NAME FROM EMPLOYEE t0, DEPARTMENT t1
WHERE ((t1.MANAGER_ID IS NULL) AND (t0.ID = t1.MANAGER_ID))
这是一个错误还是想要的东西?或者有人可以帮我解决这个问题吗?
很高兴提供代码和示例,如果有人想要它或更多信息。
答案 0 :(得分:1)
使用FETCH JOIN
引用查询中返回的实体作为副作用似乎不安全。 JPA规范试图至少对多值关联禁止此类查询(JSR 338,第4.4.5.3节):
不允许为
FETCH JOIN
子句右侧引用的对象指定标识变量,因此对隐式提取的实体或元素的引用不能出现查询。
您在EclipseLink和Hibernate上执行的查询会产生不同的结果(EclipseLink 2.6.3:没有结果,Hibernate 4.3.11:所有没有经理的部门):
select d from Department d left join fetch d.manager where d.manager is null
要解决您的问题,可以使用子查询。可移植的JPQL查询看起来像这样(在EclipseLink和Hibernate中也是如此):
select d1 from Department d1 left join fetch d1.manager where exists
(select d2 from Department d2 where d2.manager is null and d1 = d2)