Эффективный способ получить @OneToMany из списка сущностей - PullRequest
0 голосов
/ 02 июля 2019

В настоящее время я пытаюсь найти эффективный способ извлечения сопоставленных сущностей @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, который подводит итог, если мы говорим о тысячах записей.

В моей текущей тестовой системе я получаю 3982 строкичто в общей сложности занимает 5323 мс.по сравнению с 338 мс, если я просто получаю E-сущности без выборки L-сущностей.

Есть ли эффективный способ загрузить всю информацию за один раз?Одна попытка, которую я попробовал, это следующий запрос:

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

, который возвращает List<Object[]>. При использовании этого запроса количество строк будет увеличиваться, поскольку некоторые E могут дублироваться, если они содержат более 1 L.

Но, может быть, есть лучший способ, о котором я не знаю?

1 Ответ

0 голосов
/ 02 июля 2019

В качестве первой попытки вы можете попробовать две вещи:

  1. Добавить аннотацию @BatchSize в список ls
  2. Убедитесь, что у вас есть индексы для столбцов и столбцов соединения иих ссылки

Если вам не удастся взглянуть на заполнение списков самостоятельно:

  1. Запросите все Es после
  2. Извлеките все идентификаторы
  3. Разделите идентификаторы на размеры пакетов, которые находятся в пределах in вашей базы данных
  4. Запросите все L в каждом разделе для всех разделов и добавьте их в соответствующий им экземпляр E
...