Встречается на 9% собеседований по Java

Какие знаешь способы решения проблем N+1

  1. JOIN FETCH в JPQL/HQL:

    java
    @Query("SELECT e FROM Employee e JOIN FETCH e.department")
    List<Employee> findAllWithDepartment();

    Загружает связанные сущности одним запросом.

  2. EntityGraph:

    java
    @EntityGraph(attributePaths = "department")
    List<Employee> findAll();

    Указывает Hibernate загружать связи сразу.

  1. Batch Fetching:
    В аннотации @BatchSize:

    java
    @BatchSize(size = 10)
    class Department { ... }

    Загружает связанные сущности партиями.

  2. DTO Projection:

    java
    @Query("SELECT new com.example.EmployeeDto(e.id, e.name, d.name) FROM Employee e JOIN e.department d")
    List<EmployeeDto> findAllAsDto();

    Избегает N+1, выбирая только нужные поля.

  3. Second Level Cache:
    Кэширует часто запрашиваемые данные, уменьшая обращения к БД.

Выбор зависит от контекста: JOIN FETCH для простых связей, EntityGraph для динамического управления, Batch для коллекций, DTO для read-only сценариев.

Следующий вопрос

Это единственный вопрос по вашему фильтру

как отвечать на вопрос
пример собеседования
фреймворки на собеседовании
типичные вопросы junior
интервью вопросы и ответы