![](/img/trans.png)
[英]Querying a nullable @OneToOne relationship with JPA (inverse way)
[英]Querying a nullable @OneToOne relationship with JPA
我有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;
...
}
如何查詢所有具有空entity2
Entity1
對象?
因為如果我這樣做:
SELECT e FROM Entity1 e WHERE e.entity2 IS NULL
JPA 引擎在兩個表之間執行 JOIN 並放置一個無用的 WHERE 子句( WHERE entity_id = NULL
)。 繼續,它執行一個無用的本機 SQL。 怎么能
當前解決方案:
閱讀 OpenJPA 文檔,我發現應該使用 Native Queries 來解決 JPA 限制。 我可以很容易地使用本機查詢,我目前正在這樣做,但我想避免使用它。
你可以簡單地運行這個 JPQL 查詢:
SELECT e1
FROM Entity1 e1
LEFT JOIN e1.entity2 e2
WHERE e2 IS NULL
LEFT JOIN
正是您要找的。
是的,它可以在不執行連接和使用 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
當您直接查詢連接列時,這不會執行任何連接。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.