Java Разработка | Spring Boot Backend & Architecture. Программирование на Джава для Developer. IT Собеседования, Алгоритмы и Coding задачи. Уроки и курсы для роста в Tech.
Наука · 30 июля 2026 г.
🧠 Как избежать N+1 при использовании @OneToMany в JPA — 30 июля 2026 г. в 06:58:25.042
🧠 Как избежать N+1 при использовании @OneToMany в JPA Одна из самых коварных ловушек JPA - это N+1 проблема. Особенно часто она проявляется при @OneToMany, например: @Entity class Author { @OneToMany(mappedBy = "author", fetch = FetchType.LAZY) private List<Book> books; } Вы загружаете список авторов, а потом проходите по каждому и вызываете getBooks() — и BAM 💥: 1 запрос на авторов и N запросов на книги. 📌 Решение - @EntityGraph или JOIN FETCH Оба варианта решают проблему, но @EntityGraph — декларативный и более гибкий способ: @EntityGraph(attributePaths = "books") List<Author> findAll(); // Spring Data JPA ⚡️ Или через JPQL: @Query("SELECT a FROM Author a JOIN FETCH a.books") List<Author> findAllWithBooks(); 💡 Совет: всегда думайте о графе объектов. Если вам нужно сразу подтянуть связанные сущности — делайте это явно. Не надейтесь на LAZY по умолчанию. ⚠️ Осторожно с пагинацией и JOIN FETCH — могут появиться дубликаты или проблемы с LIMIT. В таких случаях лучше использовать @BatchSize или подзапросы. 👉 @BookJava

