[英]JPA - Ignore join operation in namedQuery in EclipseLink
我有以下情況
實體表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; }
實體表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; }
我面臨以下兩個問題:
上面提到的查詢即
SELECT t1 FROM TableA t1 JOIN FETCH t2.TableB t2
需要很長時間才能執行。 大約 30 秒。 但是在 SQL 開發人員中,對相同數據集的相同查詢幾乎不需要 3-4 秒。 ANythnig 我應該在代碼中做些什么來讓它運行得更快?
我有不需要來自其他表的數據的要求(通過映射檢索)。 我只需要來自 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.