【发布时间】:2014-08-26 15:30:49
【问题描述】:
我在一个非常简单的项目中使用 EclipseLink(2.4、2.5 和 2.6),其中我有一个 Department 实体,每个 Department 链接到一个 Employee 实体,它是 Department 的 manager .
我目前无法使这个简单的查询工作:
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))
这是一个错误还是需要什么?或者有人可以帮我解决这个问题吗?
如果有人需要,很乐意提供代码和示例,或者更多信息。
【问题讨论】:
-
尝试使用此处描述的 fetch-join 查询提示:wiki.eclipse.org/EclipseLink/UserGuide/JPA/…,而不是在 JPQL 中使用它。解析器似乎在那里看到了 d.manager 两次,因此构建了一个内部连接 - 您可能会为此提交一个错误,因为这两个连接应该是独立的
-
@Chris 添加此
query.setHint(QueryHints.LEFT_FETCH, "d.manager");并没有改变结果。然而,使用这个查询select d from Department d left join d.manager m where m is null确实有效,但似乎有点牵强。 -
它起作用的原因是在 where 子句中指定 d.manager 需要一个内连接。当关系没有在其他地方使用时,EclipseLink 可以判断出不需要关系本身,只需要外键,因此不需要加入。当您在其他地方使用关系时,d.manager 内连接胜过任何其他连接,因此使用内连接。通过使用 m 为 null,您将强制它使用外连接逻辑。指定外连接是在 JPA 中执行此操作的正确方法,因为某些关系需要连接来解决。
标签: java jpa eclipselink left-join isnull