Ищете ответ из достоверных и / или официальных источников.
Как насчет документации JBoss ORM?
https://docs.jboss.org/hibernate/orm/current/userguide/html_single/chapters/fetching/Fetching.html
Существует несколько областей определения выборки:
статическая
Статическое определение стратегий выборки выполненов отображениях.Статически определенные стратегии выборки используются в отсутствие каких-либо динамически определенных стратегий
SELECT Выполняет отдельный выбор SQL для загрузки данных.Это может быть EAGER (второй выбор выдается немедленно) или LAZY (второй выбор откладывается до тех пор, пока не потребуются данные).Эта стратегия обычно называется N + 1.
JOIN По своей сути стиль извлечения EAGER.Данные, которые должны быть получены, получены с помощью внешнего соединения SQL.
BATCH Выполняет отдельный выбор SQL для загрузки ряда связанных элементов данных, используя ограничение IN как частьSQL-предложение WHERE, основанное на размере пакета.Опять же, это может быть EAGER (второй выбор выполняется немедленно) или LAZY (второй выбор задерживается до тех пор, пока не потребуются данные).
SUBSELECT Выполняет отдельный выбор SQL для загрузкисвязанные данные на основе ограничения SQL, используемого для загрузки владельца.Опять же, это может быть либо EAGER (второй выбор выдается немедленно), либо LAZY (второй выбор откладывается до тех пор, пока не потребуются данные).
динамический (иногда упоминается как время выполнения)
Динамическое определение действительно ориентировано на прецедент.Существует несколько способов определения динамической выборки:
Профили выборки , определенные в отображениях, но их можно включить / отключить в сеансе.
HQL / JPQL и запросы Hibernate и JPA Criteria имеют возможность указать выборку, специфичную для указанного запроса.
Графы сущностей Начиная с Hibernate 4.2 (JPA 2.1), это также вариант.
И чтобы доказать ответ выше, вот пример:
FetchMode.SUBSELECT Чтобы продемонстрировать, как работает FetchMode.SUBSELECT, мы собираемся изменитьпример отображения FetchMode.SELECT для использования FetchMode.SUBSELECT:
Пример 17. Пример отображения FetchMode.SUBSELECT:
@OneToMany(mappedBy = "department", fetch = FetchType.LAZY)
@Fetch(FetchMode.SUBSELECT)
private List<Employee> employees = new ArrayList<>();
Теперь мы собираемся получить всеСубъекты отдела, которые соответствуют заданным
критериям фильтрации и затем перемещаются по коллекциям своих сотрудников.
Hibernate избежит проблемы с запросом N + 1, создав один оператор SQL для инициализации всех ихКоллекции ployees для всех подразделений Департамента, которые были ранее получены.Вместо того чтобы передавать все идентификаторы сущностей, Hibernate просто перезапускает предыдущий запрос, который выбрал сущности Department.
Пример 18. Пример отображения FetchMode.SUBSELECT:
List<Department> departments = entityManager.createQuery(
"select d " +
"from Department d " +
"where d.name like :token", Department.class)
.setParameter( "token", "Department%" )
.getResultList();
log.infof( "Fetched %d Departments", departments.size());
for (Department department : departments ) {
assertEquals(3, department.getEmployees().size());
}
- Получил 2 отдела
SELECT
d.id as id1_0_
FROM
Department d
where
d.name like 'Department%'
-- Fetched 2 Departments
SELECT
e.department_id as departme3_1_1_,
e.id as id1_1_1_,
e.id as id1_1_0_,
e.department_id as departme3_1_0_,
e.username as username2_1_0_
FROM
Employee e
WHERE
e.department_id in (
SELECT
fetchmodes0_.id
FROM
Department fetchmodes0_
WHERE
d.name like 'Department%'
)