Логотип YeaHub

База вопросов

Собеседования

Тренажёр

База ресурсов

Обучение

Навыки

Задачи

Войти

Выбери, каким будет IT завтра — вместе c нами!

YeaHub — это полностью открытый проект, призванный объединить и улучшить IT-сферу. Наш исходный код доступен для просмотра на GitHub. Дизайн проекта также открыт для ознакомления в Figma.

© 2026 YeaHub

AI info

Карта сайта

Документы

Медиа

Назад
Вопрос про Spring: orm, performance, query, jpa

Решение проблемы N+1 для связанных сущностей

Проверяет умение оптимизировать загрузку данных в ORM.

Короткий ответ

N+1 возникает, когда для каждой из N сущностей выполняется отдельный запрос за связанными данными. Решения:

  1. JOIN FETCH в JPQL.

  2. EntityGraph.

  3. BatchSize для пакетной загрузки.

Длинный ответ

Пример проблемы:

List<Author> authors = authorRepository.findAll(); // 1 запрос: SELECT * FROM author
authors.forEach(author -> {
    	author.getBooks().size(); // N запросов: SELECT * FROM book WHERE author_id = ?
});

Способы решения:

  1. JPQL с JOIN FETCH:

    @Query("SELECT a FROM Author a JOIN FETCH a.books")
    List<Author> findAllWithBooks();
    • Плюсы: Один запрос, данные загружаются сразу.

    • Минусы: Риск дублирования данных (например, если у автора 100 книг, его данные повторятся 100 раз).

  2. EntityGraph:

    @EntityGraph(attributePaths = "books")
    List<Author> findAll();
    • Генерирует LEFT OUTER JOIN.

  3. @BatchSize:

    @Entity
    public class Author {
        	@OneToMany(fetch = LAZY)
        	@BatchSize(size = 10) // Загружает книги пачками по 10 авторов
        	private List<Book> books;
    }
    • Запрос: SELECT * FROM book WHERE author_id IN (?, ?, ...).

Вывод: Используйте JOIN FETCH для точечных запросов, BatchSize — для глобальной оптимизации.

Уровень

  • Рейтинг:

    2

  • Сложность:

    5

Навыки

  • Spring

    Spring

Ключевые слова

#orm

#performance

#query

#jpa

Подпишись на Java Developer в телеграм