我有Entity1
和Entity2
。他们有一个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限制。我可以使用原生查询轻松获取它并且我目前正在使用它,但我想避免使用它。
答案 0 :(得分:5)
您只需运行此JPQL查询:
SELECT e1
FROM Entity1 e1
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL
LEFT JOIN
正是您所寻找的。 p>
答案 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
当您查询直接加入列时,这不会执行任何连接。