我有一个名为“OrganizationVideo”的实体,它有一个名为“Video”的一对一实体,它有一个名为“OrganizationIssue”的父实体,它有一个名为 published
构建一个查询以选择任何 OrganizationVideo
有 video 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/