为什么JPQL的“OR”运算符缩小了结果集?

时间:2011-12-01 17:53:19

标签: jpa jpql

我有三个表:“用户”,“员工”和“工人”。 “用户”表与“工作人员”具有一对一或一对一关系,与“员工”具有相同的一对一或一对一关系。用户实体bean具有以下映射属性:

@OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
private Worker worker;
@JoinColumn(name = "id_employee", referencedColumnName = "id")
@OneToOne
private Employee idEmployee;

我的目标是获取所有具有此属性之一的“用户”记录(非空)。我尝试使用查询:

SELECT u FROM User u WHERE u.idEmployee IS NOT NULL OR u.worker IS NOT NULL
ORDER BY u.login

我想要获得15条记录,但我只得到6.我将此查询分为两个单独的:

SELECT u FROM User u WHERE u.idEmployee IS NOT NULL ORDER BY u.login;
SELECT u FROM User u WHERE u.worker IS NOT NULL ORDER BY u.login;

我分别得到了9条和6条记录。放在一起 - 需要15条记录。 screenshot of queries and result sets

看起来“OR”将结果集缩小到只有那些工作字段不为空的记录。为什么它以这种方式工作?提前谢谢。

2 个答案:

答案 0 :(得分:4)

工作者关联由工作表中的外键映射。这意味着使用u.worker对worker表进行内部联接,is not null始终为true。生成的SQL应如下所示:

select u.* from user u, worker w where u.id = w.user_id and w.user_id is not null.

您需要使用左连接来接受没有工作人员的用户:

select u from User u
left join u.worker w
left join u.employee e
where w is not null or e is not null

答案 1 :(得分:0)

我最近实际上遇到了类似的问题,事实证明我使用的是旧版本的eclipse链接,其中如果语句为/和/或语句的一部分,则语句为null且不为null。 如果我记得修复那是在eclipse链接2.2.0。如果你没有使用eclipse链接,请忽略我的帖子。