簡體   English   中英

使用 JPA 查詢可為空的 @OneToOne 關系

[英]Querying a nullable @OneToOne relationship with JPA

我有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;
   ...
}

如何查詢所有具有空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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM