Java 查询与JPA的可空@OneToOne关系

Java 查询与JPA的可空@OneToOne关系,java,sql,hibernate,jpa,jpql,Java,Sql,Hibernate,Jpa,Jpql,我有Entity1和Entity2。他们之间有一种一刀切的关系 @Entity class Entity1 { @Id @Column(name = "id") private Long id; @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity2") @JoinColumn(nullable = true) private Entity2

我有
Entity1
Entity2
。他们之间有一种一刀切的关系

@Entity
class Entity1 {

   @Id
   @Column(name = "id")
   private Long id;

   @OneToOne(fetch = FetchType.LAZY, cascade = CascadeType.ALL, mappedBy = "entity2")
   @JoinColumn(nullable = true)    
   private Entity2 entity2;
   ...
}
如何查询所有具有空
entity2
Entity1
对象?

因为如果我这样做:

SELECT e FROM Entity1 e WHERE e.entity2 IS NULL
JPA引擎在两个表之间进行连接,并放置一个无用的WHERE子句(
WHERE entity\u id=NULL
)。恢复时,它执行一个无用的本机SQL。 怎么可能

当前解决方案:


阅读OpenJPA文档,我发现应该使用本机查询来解决JPA的限制。我可以很容易地使用本机查询,目前我正在这样做,但我想避免使用它。

是的,不需要执行连接和使用JPA查询就可以完成。请查看以下代码段:

@实体
类实体1{
...
@OneToOne(…)
@JoinColumn(name=“entity2ID”)
私人实体2实体2;
@列(name=“entity2ID”,nullable=true,insertable=true,updateable=true)
私有长实体2id;
...
}
只需将实体中的连接列映射为可插入/可更新为FALSE。请确保绝对不为xyz或联接列提供setter方法。完成此操作后,您可以使用以下查询:

从Entity1 e中选择e,其中e.entity2ID为空

这不会执行任何联接,因为您正在直接查询联接列。

您只需运行此JPQL查询:

SELECT e1 
FROM Entity1 e1 
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL

LEFT JOIN
就是您所要寻找的。

您能否提供有关这些实体如何相互关联的更具体细节?你是在使用
@JoinColumn
还是
mappedBy
链接方法,或者这是一个
@PrimaryKeyJoinColumn
?我在代码中添加了它。这是一个很好的解决方案,但我认为Vlad答案很容易维护。它很有效。通过阅读任何特殊文档,您是否了解了这一点?我想更好地理解它。它是标准SQL。任何人都可能会涉及到这一点。我不是在说JPQL。在SQL中,我做得对。我不知道是否有一个参考文档涵盖了它。