Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/jpa/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jpa 为什么JPQL的“OR”运算符会缩小结果集?_Jpa_Jpql - Fatal编程技术网

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

Jpa 为什么JPQL的“OR”运算符会缩小结果集?,jpa,jpql,Jpa,Jpql,我有三个表:用户、雇员和工人。用户表与Worker具有一对零或一关系,与Employee具有相同的一对零或一关系。用户实体bean具有以下映射属性: @OneToOne(cascade = CascadeType.ALL, mappedBy = "user") private Worker worker; @JoinColumn(name = "id_employee", referencedColumnName = "id") @OneToOne private Employee idEmpl

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

@OneToOne(cascade = CascadeType.ALL, mappedBy = "user")
private Worker worker;
@JoinColumn(name = "id_employee", referencedColumnName = "id")
@OneToOne
private Employee idEmployee;
我的目标是让所有填充了其中一个属性的用户记录不为null。我尝试使用以下查询:

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条记录。


它看起来像是或将结果集缩小到只有那些worker字段不为null的记录。为什么会这样呢?提前感谢。

工作者关联由工作者表中的外键映射。这意味着使用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

工作者关联由工作者表中的外键映射。这意味着使用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

事实上,我最近也遇到了类似的问题,结果证明我使用的是旧版本的eclipse链接,其中的语句为null,如果它们是and/or语句的一部分,则未正确执行。
如果我还记得的话,在EclipseLink2.2.0中对此进行了修复。如果您没有使用eclipse链接,请忽略我的帖子。

我最近确实遇到了类似的问题,事实证明我使用的是旧版本的eclipse链接,其中的语句为null,如果它们是and/or语句的一部分,则未正确执行。
如果我还记得的话,在EclipseLink2.2.0中对此进行了修复。如果您没有使用eclipse链接,请忽略我的帖子。

如果您实际查看调用的SQL,您可能会理解,当我使用DataNucleus执行相同的JPQL时,它会执行左外连接,因此给出了预期的结果…也许如果您实际查看调用的SQL,您会理解,当我使用DataNucleus执行相同的JPQL时,它会执行一个左外部联接,并因此给出预期的结果…我不理解为什么在我的示例中会出现这种情况,但您的内部联接示例解决了我的问题,请求返回的正是我需要的。非常感谢。这不是,或者说,这是你。worker=,它生成一个SQL内部联接,将结果仅限于具有非空用户id的用户。如果JPA实现不费心分析完整的JPQL,那么worker将只生成一个内部联接;一些人意识到,左外是needed@DataNucleus:如果我正确地阅读了规范,那么这样一个智能的JPA实现,我想我知道您考虑的是哪一个会违反规范,该规范说:路径表达式导航性是使用“内部连接”组成的语义这样的实现通过了上述规范的所有符合性测试,并且通过提供智能SQL生成,为用户提供了他们在使用OR子句时逻辑上期望查询生成的内容,也就是说,当存在OR子句且其中一方组成联接时,使用left outer是唯一的逻辑选项。当然,其他实现会将这种想法强加给用户,但他们不是在尝试帮助用户完成他们的工作吗?我不明白为什么在我的示例中会出现这种情况,但您的内部连接示例解决了我的问题,请求返回的正是我所需要的。非常感谢。这不是,或者说,这是你。worker=,它生成一个SQL内部联接,将结果仅限于具有非空用户id的用户。如果JPA实现不费心分析完整的JPQL,那么worker将只生成一个内部联接;一些人意识到,左外是needed@DataNucleus:如果我正确地阅读了规范,那么这样一个智能的JPA实现,我想我知道您考虑的是哪一个会违反规范,该规范说:路径表达式导航性是使用“内部连接”组成的语义这样的实现通过了上述规范的所有符合性测试,并且通过提供智能SQL生成,为用户提供了他们在使用OR子句时逻辑上期望查询生成的内容,也就是说,当存在OR子句且其中一方组成联接时,使用left outer是唯一的逻辑选项。当然,其他实现会将这种想法强加给用户,但是他们不是在尝试帮助用户完成他们的工作吗?