使用JPA查询可以为空的@OneToOne关系

时间:2015-06-03 21:01:51

标签: java sql hibernate jpa jpql

我有Entity1Entity2。他们有一个OneToOne可以为空的关系。

@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;
   ...
}

如何查询空Entity1的所有entity2个对象?

因为如果我这样做:

SELECT e FROM Entity1 e WHERE e.entity2 IS NULL

JPA引擎在两个表之间执行JOIN并放置一个无用的WHERE clausule(WHERE entity_id = NULL)。恢复,它执行一个无用的本机SQL。 怎么可以

当前解决方案:

阅读OpenJPA文档,我发现应该使用Native Queries来解决JPA限制。我可以使用原生查询轻松获取它并且我目前正在使用它,但我想避免使用它。

2 个答案:

答案 0 :(得分:5)

您只需运行此JPQL查询:

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

LEFT JOIN正是您所寻找的。

答案 1 :(得分:1)

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

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

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

SELECT e FROM Entity1 e WHERE e.entity2ID IS NULL

当您查询直接加入列时,这不会执行任何连接。