使用 JPA 查询可为空的 @OneToOne 关系
Querying a nullable @OneToOne relationship with JPA
我有 Entity1
和 Entity2
。它们具有 OneToOne 可为 null 的关系。
@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 引擎在两个表之间进行 JOIN 并放置一个无用的 WHERE 子句 (WHERE entity_id = NULL
)。恢复,它执行一个无用的本机 SQL。
怎么可以
当前解法:
阅读 OpenJPA 文档,我发现应该使用本机查询来解决 JPA 限制。我可以使用本机查询非常轻松地获得它,我目前正在这样做,但我想避免使用它。
是的,无需执行连接和使用 JPA 查询即可完成。查看以下代码片段:
@Entity
class Entity1 {
...
@OneToOne(...)
@JoinColumn(name="entity2ID")
private Entity2 entity2;
@Column(name="entity2ID", nullable=true, insertable=true, updatable=true)
private Long entity2ID;
...
}
只需将实体中的连接列映射为 insertable/updatable 为 FALSE。确保您绝对不为 xyz 或加入列提供 setter 方法。完成后,您可以使用以下查询:
SELECT e FROM Entity1 e WHERE e.entity2ID IS NULL
这不会执行任何连接,因为您正在查询直接连接列。
您可以简单地 运行 这个 JPQL 查询:
SELECT e1
FROM Entity1 e1
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL
LEFT JOIN
就是您要找的。
我有 Entity1
和 Entity2
。它们具有 OneToOne 可为 null 的关系。
@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 引擎在两个表之间进行 JOIN 并放置一个无用的 WHERE 子句 (WHERE entity_id = NULL
)。恢复,它执行一个无用的本机 SQL。
怎么可以
当前解法:
阅读 OpenJPA 文档,我发现应该使用本机查询来解决 JPA 限制。我可以使用本机查询非常轻松地获得它,我目前正在这样做,但我想避免使用它。
是的,无需执行连接和使用 JPA 查询即可完成。查看以下代码片段:
@Entity
class Entity1 {
...
@OneToOne(...)
@JoinColumn(name="entity2ID")
private Entity2 entity2;
@Column(name="entity2ID", nullable=true, insertable=true, updatable=true)
private Long entity2ID;
...
}
只需将实体中的连接列映射为 insertable/updatable 为 FALSE。确保您绝对不为 xyz 或加入列提供 setter 方法。完成后,您可以使用以下查询:
SELECT e FROM Entity1 e WHERE e.entity2ID IS NULL
这不会执行任何连接,因为您正在查询直接连接列。
您可以简单地 运行 这个 JPQL 查询:
SELECT e1
FROM Entity1 e1
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL
LEFT JOIN
就是您要找的。