Добрый день, у меня в сущности (A) есть атрибут который загружает список связанной сущности (B). В связанной сущности тоже есть 2 атрибута, которые содержат в себе списки связанных сущностей (C)(D). У меня задача вывести поля и сущности (C) и (D) при открытия list-view сущности (A). Это получилось сделать с помощью такого кода в сущности (A):
@Composition @OneToMany(mapped = “idB”, casace = CascadeType.ALL)
private List listB;
public String getAttributeC(){
List list = new ArrayList<>():
listB.forEach(b-> b.getListC.forEach(C->list.add(C.getAttribute) Такой же гет для атрибута D
Вопрос в том, что это вызывает 3 select запроса в бд, что не очень оптимально. Как возможно сделать жадную загрузку listB, чтоб сразу загрузить все дочерние сущности и сократить кол-во запросов в бд, до 1. Заранее спасибо
Добрый вечер, да попробовал.
Наблюдаю, что при загрузки list происходит 1 select: “select e from A e”
Далее следует Fetch modes e.B=JOIN, C=JOIN, D=JOIN
Формируется большой select запрос составляющий компоненты всех 4 сущностей.
Следом идут 3 select запроса к сущностям B, C, D.
Мб вы в экране используете какие-то параметры, которые не включены в fetchPlan? Проверьте есть ли поля которые не грузятся в 1ом select и грузятся в других.
В DataGrid есть все поля сущности A кроме них ничего не добавляется. Включая добавленные поля из сущности C и D, которые описаны в сущности A. Пытаюсь понять корректно ли такое поведение в целом или нет, что нужны select для b,c,d когда ранее был сформирован один большой select запрос который уже включает атрибуты этих сущностей
Если вам нужно только отобразить эти данные в UI-таблице, скорее всего более эффективно и управляемо будет не включать транзиентные атрибуты в модель, а добавить колонки с рендерерами в саму UI-таблицу (см. 5. Работа с данными в пользовательском интерфейсе :: Документация Jmix), и грузить эти связанные данные запросом из экрана.