我有三个表:“用户”,“员工”和“工人”。 “用户”表与“工作人员”具有一对一或一对一关系,与“员工”具有相同的一对一或一对一关系。用户实体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条记录。
看起来“OR”将结果集缩小到只有那些工作字段不为空的记录。为什么它以这种方式工作?提前谢谢。
答案 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链接,请忽略我的帖子。