java - 带条件(真或某些原因导致 NPE)的 Hibernate 选择列表不返回任何结果

标签 java mysql database hibernate jpa

我有一个名为“OrganizationVideo”的实体,它有一个名为“Video”的一对一实体,它有一个名为“OrganizationIssue”的父实体,它有一个名为 published

的 boolean 字段

构建一个查询以选择任何 OrganizationVideovideo having OrganizationIssue.published=true 或没有任何 OrganziationIssues organizationIssue 为空

select ov from OrganizationVideo ov where (ov.video.organizationIssue is null OR  ov.video.organizationIssue.published=true)

所以问题是为什么当第二个 OR 不匹配时此查询不返回任何内容,这意味着 ov.video.organizationIssue 为 null

如果 hibernate 像 Java 一样工作,那可能是有效的,因为第二个操作数将触发 NullPointerException

生成的 SQL 语句:

select organizati0_.id as organizati0_.organization from organization_video organizati0_ left outer join video video1_ on organizati0_.id=video1_.id cross join organization_issue organizati2_ where video1_.organization_issue=organizati2_.id and organizati0_.organization=? and (video1_.organization_issue is null or organizati2_.published=1) order by organizati0_.id desc

最佳答案

如果你想在多个地方引用 ov.video,你需要做一个明确的 JOIN,然后它对 WHERE 的两个部分使用这个连接(而不是做一个单独的 INNER JOIN每个)。您可能会通过查看查询生成的 SQL 来解决这个问题。

使用显式连接你会更喜欢

SELECT ov FROM OrganizationVideo ov LEFT OUTER JOIN ov.video v LEFT OUTER JOIN v.organisationIssues oi
WHERE (oi is null OR oi.published=true)

您可以根据具体要求在那里使用 (INNER) JOIN,但要点是相同的……通过显式指定连接,您可以保证会发生什么。

关于java - 带条件(真或某些原因导致 NPE)的 Hibernate 选择列表不返回任何结果,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38814650/

相关文章:

java - 自动执行计划任务 - 运行 main.java 文件

c# - 使用从第一个表返回的 ID 从两个相关表中删除

java - Primefaces5 如何更改图表中的背景颜色(纯 java,无 jqplot)

带数据库的 Java GUI

mysql - 如何在 ruby​​ on Rails 中直接保存迁移文件中的数据

MySQL存储过程没有返回值

mysql - 计算每个销售代表的佣金

database - 具有 2 个不同所有者实体的弱实体

java - 是否允许使用不同微服务中的相同表?

php - 使用表单 php/mysql 进行更新