簡體   English   中英

從實體列表中獲取@OneToMany的有效方法

[英]Efficient way to fetch @OneToMany from a list of entities

我目前正在嘗試找出一種從其他實體列表中獲取@OneToMany映射實體的有效方法。

讓我們來看看細節:
我有E和L這兩個類(注意:兩者都具有JPA / Hibernate必需的注釋等。我只是忽略了這些信息,因為它們對我的情況並不重要)

public class L {
    public String name;
}

public class E {
    @ManyToMany(cascade = { CascadeType.PERSIST, CascadeType.MERGE })
    public List<L> ls = new LinkedList<>();

    public String name;

    [...]

}

對於導出,我想獲取所有E對象及其相關信息,包括L的相應列表。通常,我會使用常規查詢來執行此操作,如下所示:

@Query("select e from E e where [...]")

結果將是List<E>

當我繼續創建導出文件時,系統會為每個E獲取L的列表,如果我們要討論的條目數為1000,則將其匯總。

在當前的測試系統中,我要檢索3982行,總共需要5323ms。 如果我僅獲取E實體而不獲取L實體,則為338ms。

有沒有一種有效的方式可以一次性加載所有信息? 我嘗試的一種嘗試是以下查詢:

@Query("select e, l from E e LEFT JOIN e.ls l where [...]")

它返回List<Object[]>使用此查詢,行數將增加,因為當某些E包含多個L時,它們可能會重復。

但是,也許還有我不知道的更好的方法?

首次嘗試時,您可以嘗試兩件事:

  1. 將@BatchSize批注添加到列表ls
  2. 確保在連接列及其引用上具有索引

失敗的話,您可以自己查看填充列表:

  1. 查詢您想要的所有E
  2. 提取所有E ID
  3. 分區ID划分成批次生產中的是in你的數據庫的限制
  4. 在每個分區中查詢所有分區的所有L,並將它們添加到各自的E實例中

暫無
暫無

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

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