Выбор ответа Senior Spring Data JPA обновлено
join fetch и пагинация
Вопрос
Запрос select o from Order o join fetch o.items с Pageable размером 20. Что сделает Hibernate 6?
Попробуйте сами
Выберите вариант, и откроется разбор.
Показать ответ и разбор
Коротко
Правильный ответ: Предупредит и сделает пагинацию в памяти, загрузив все строки. С fetch join коллекции строк больше, чем заказов, и LIMIT по строкам обрезал бы коллекции.
Варианты ответа
- Добавит LIMIT 20 к SQL, и вернутся ровно 20 заказов с позициями
- Добавит LIMIT 20, и вернутся заказы с обрезанными коллекциями items
- Всегда откажется выполнять такой запрос с ошибкой при старте
- Предупредит и сделает пагинацию в памяти, загрузив все строкиправильный ответ
Разбор
С fetch join коллекции строк больше, чем заказов, и LIMIT по строкам обрезал бы коллекции. Поэтому Hibernate выбирает всё без LIMIT и делает пагинацию в памяти, выводя предупреждение (HHH90003004). На большой таблице это OOM. Строгий режим hibernate.query.fail_on_pagination_over_collection_fetch=true превращает предупреждение в ошибку, но по умолчанию он выключен. Правильно: сначала страница id, потом отдельный запрос с fetch, или @BatchSize.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.