У меня есть объект A, который содержит отношение @OneToOne к объекту B.
Объект B, в свою очередь, имеет отношение @OneToOne к объекту C:
A
|
|--B @OneToOne
|
|--C @OneToOne
Мне нужно выбрать все данные Объекта A с некоторыми полями Объекта B. Поля Объекта C следует игнорировать.
Зная, что в Hibernate типом выборки по умолчанию для отношений * ToOne является EADGER, когда getResultList критериев Api вызывается для объекта A, выполняется N + 1 запрос (3 выбора).
Я использую Spring Data JPA с Spring Boot поверх БД Oracle.
Чтобы избежать этой проблемы и выполнить только один запрос, я настроил правильный выбор соединения из объекта A в объект B.
С этой конфигурацией я ожидаю решения проблемы, но я заметил, что hibernate выполняет два выбора, а не один. Он извлекает сущность A и сущность B в один и тот же запрос, как настроено в выборке, но выполняет дополнительный запрос для загрузки C.
Чтобы решить, мне нужно настроить правильный выбор соединения также для Entity C.
Это правильный подход?
Я в ужасе, потому что это простой случай, но что происходит в сложном случае, с множеством отношений и вложенных элементов?
Есть ли способ игнорировать вложенные отношения?
Я также пытался использовать выборку правого соединения на объекте A в сочетании с @LazyToOne (инструментарий во время компиляции). Но он всегда выполняет два запроса:
Первый, на query.getResultList (), является правильным запросом и правильно извлекает все необходимые данные.
Второй, запускается Hibernate, когда я пытаюсь получить доступ к объекту B с помощью getB (). Этот запрос имеет странное поведение: он получает идентификатор объекта B из объекта A.
Что-то вроде:
Выберите b.id из где a. Id =?
Я не знаю, почему он выполняет этот дополнительный запрос!
Как решить элегантно?
Спасибо