Java Hibernate选择带有条件的列表(true或导致NPE的某些内容)不会返回任何结果

Java Hibernate选择带有条件的列表(true或导致NPE的某些内容)不会返回任何结果,java,mysql,database,hibernate,jpa,Java,Mysql,Database,Hibernate,Jpa,我有一个名为“OrganizationVideo”的实体,它有一个名为“Video”的一对一实体,它有一个名为“OrganizationIssue”的父实体,该父实体的布尔字段名为“published” 生成一个查询以选择任何OrganizationVideo,其中包含具有OrganizationIssue的视频。published=true或不包含任何OrganizationIssueOrganizationIssue为null select ov from OrganizationVideo

我有一个名为“OrganizationVideo”的实体,它有一个名为“Video”的一对一实体,它有一个名为“OrganizationIssue”的父实体,该父实体的布尔字段名为“published”

生成一个查询以选择任何
OrganizationVideo
,其中包含
具有OrganizationIssue的视频。published=true
或不包含任何
OrganizationIssue
OrganizationIssue为null

select ov from OrganizationVideo ov where (ov.video.organizationIssue is null OR  ov.video.organizationIssue.published=true)
所以问题是,为什么这个查询在第二个或不匹配时不返回任何内容,这意味着
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
,则需要执行显式联接,这样它就可以对WHERE的两个部分使用此联接(而不是对每个部分执行单独的内部联接)。您可能会通过查看查询生成的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)

您可以使用(内部)连接,这取决于精确的要求,但要点是相同的。。。通过显式指定联接,您可以保证所发生的事情。

这与查询优化一样好,但并不能解决我的问题“它不起作用”。那么调试告诉您什么呢?你知道,看看调用的SQL?没有结果:查询实际上返回0个结果我用SQL语句更新了问题genearted这是为该查询生成的SQL,我发现了一个类似的问题,关于什么查询????你有一个疑问。我提出了一个不同的问题。决定你在问什么,然后把问题放在一边