簡體   English   中英

JPA - 在 EclipseLink 中的 namedQuery 中忽略連接操作

[英]JPA - Ignore join operation in namedQuery in EclipseLink

我有以下情況

  1. 實體表A:

     @Entity @Table(name = "TABLE_A") @NamedQueries({ @NamedQuery(name = "TableA.namedQ1", query = "SELECT t1 FROM TableA t1 JOIN FETCH t2.TableB t2" + " WHERE <conditions here>"), @NamedQuery(<Need query here which will ignore mapping below and return rows only for TableA>) } ) public class TableA implements Serializable{ @Id @Column(name = "id") private int id... ... ... @OneToMany(mappedBy = "tableA", cascade = CascadeType.ALL,fetch=FetchType.LAZY) private List<TableB> tableB; }
  2. 實體表B:

     @Entity @Table(name = "TABLE_B") public class TableB implements Serializable{ @Id @Column(name = "id1") private int id1... ... ... @ManyToOne @JoinColumn(name = "id",insertable = false, updatable = false) private TableA tableA; }

我面臨以下兩個問題:

  1. 上面提到的查詢即

     SELECT t1 FROM TableA t1 JOIN FETCH t2.TableB t2

需要很長時間才能執行。 大約 30 秒。 但是在 SQL 開發人員中,對相同數據集的相同查詢幾乎不需要 3-4 秒。 ANythnig 我應該在代碼中做些什么來讓它運行得更快?

  1. 我有不需要來自其他表的數據的要求(通過映射檢索)。 我只需要來自 TableA 的數據。 我嘗試了下面的命名查詢,但它針對 TableA 中的每一行對 TableB 運行單獨的查詢,這需要 4 分鍾以上的時間才能執行。

     "SELECT t1 FROM TableA t1 where <condition goes here>"

    我必須在查詢中進行哪些修改才能忽略映射。 我需要保留注釋(@OneToMany),因為我將在 namedQ1 中需要它。

感謝期待

當您使用FETCH時,您要求提前檢索集合的數據。 如果您不需要 TableB 中的元素,那么您的查詢應該是:

SELECT t1 FROM TableA t1 left join t1.tableB t2

請注意,僅當您需要向 t2 添加一些條件時才需要連接。 例如:

SELECT t1 FROM TableA t1 left join t1.tableB t2 WHERE t2.field = 123

如果這不是你的情況,那么這就足夠了:

SELECT t1 FROM TableA t1;

在所有這些情況下,它將為集合TableB創建一個代理,並且不需要訪問數據庫上的表,除非您以后需要使用該集合。

對於任何有類似問題的人

  Question 1 in OP : https://stackoverflow.com/questions/61573091/long-time-of-fetching-data-from-oracledb-using-eclipselink

  Question 2 in OP: Solved using @Davide solution

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

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