如何使用JPA查询可空的@OneToOne关系

12

我有实体1实体2。它们之间具有可空的一对一关系。

@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;
   ...
}
如何查询所有具有空entity2Entity1对象?

因为如果我这样做:

SELECT e FROM Entity1 e WHERE e.entity2 IS NULL

JPA引擎在两个表之间执行JOIN并放置一个无用的WHERE子句(WHERE entity_id = NULL)。总结一下,它执行了一个无用的本地SQL。

当前解决方案:

阅读OpenJPA文档后,我发现应该使用本地查询来解决JPA的限制。我可以很容易地使用本地查询来解决问题,但我想避免使用它。


你能否提供更具体的细节,说明这些实体是如何相互关联的?你是使用 @JoinColumn 还是 mappedBy 方法进行链接,或者这是一个 @PrimaryKeyJoinColumn 吗? - DuncanKinnear
我在代码中添加了它。 - John John Pichler
2个回答

8
您可以简单地运行此JPQL查询:
SELECT e1 
FROM Entity1 e1 
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL
LEFT JOIN 是您正在寻找的。

1
它起作用了。你是通过阅读特殊文档学习到的吗?我想更好地理解它。 - John John Pichler
这是标准的SQL。任何SQL教程都可能涵盖此内容。 - Vlad Mihalcea
我说的不是JPQL,SQL方面我做得正确。 - John John Pichler
我不知道是否有一份涵盖此内容的参考文档。 - Vlad Mihalcea

0

是的,可以在不执行连接并使用JPA查询的情况下完成。请查看以下代码片段:

@Entity
class Entity1 {
   ...
   @OneToOne(...)
   @JoinColumn(name="entity2ID")
   private Entity2 entity2;
   @Column(name="entity2ID", nullable=true, insertable=true, updatable=true)
   private Long entity2ID;
   ...
}

只需将实体中的连接列映射为不可插入/更新即可。确保绝对不提供xyz或连接列的setter方法。完成此操作后,您可以使用以下查询:

SELECT e FROM Entity1 e WHERE e.entity2ID IS NULL

这不会执行任何连接操作,因为您直接查询了连接列。

好的解决方案,但我认为Vlad的答案更易于维护。 - John John Pichler

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接