Методы запросов

Тема дорожной карты · Spring Boot

Методы запросов Spring Data — это возможность Spring Data JPA и других модулей Spring Data, позволяющая разработчикам объявлять запросы к базе данных в виде сигнатур методов в интерфейсе репозитория, при этом Spring Boot генерирует реализацию во время запуска. Расширяя JpaRepository<Entity, ID> или CrudRepository, разработчик получает встроенные CRUD-операции плюс возможность определять выводимые запросы, такие как findByLastNameAndActiveTrue(String lastName) или findTop5ByPriceOrderByCreatedAtDesc(), которые Spring Data автоматически транслирует в JPQL или нативный SQL. Для сложных сценариев, выходящих за рамки вывода, аннотация @Query принимает строки на JPQL или нативном SQL, тогда как аннотация @Modifying в сочетании с @Transactional разрешает операции обновления и удаления, обходящие кэш первого уровня Hibernate. Методы запросов Spring Data интегрируются с поддержкой пагинации Spring Boot через возвращаемые типы Pageable и Page<T>, упрощая добавление курсорной или сдвиговой пагинации в REST API, построенные с @RestController. Выполнение запросов опирается на Hibernate как JPA-провайдер и интегрируется с пулом соединений Spring Boot (HikariCP), слоем кэширования (@Cacheable со Spring Cache) и интеграционными тестами на базе Testcontainers для проверки корректности запросов на реальной базе данных.

Как это работает

Методы запросов: Spring Data JPA оборачивает Hibernate (JPA-реализация). @Entity маппит Java-класс → DB-таблица; JpaRepository<T, ID> даёт CRUD + paging + sorting бесплатно. Method names типа findByEmailAndStatus парсятся в queries; сложные queries — @Query (JPQL или native SQL). Relations: @OneToMany, @ManyToOne, @ManyToMany — дефолтный fetch LAZY (one-to-many) или EAGER (many-to-one); знаменитая N+1 проблема прячется здесь. @Transactional оборачивает service-методы в DB-транзакцию.

Когда применять

Все relations LAZY по дефолту + JOIN FETCH или entity graphs для eager-загрузки только когда надо. Projections (DTO/interface) для read-only endpoints — пропускают Hibernate entity overhead. Мониторьте N+1 (Hibernate stats, p6spy или Datasource Proxy в тестах). Для heavy-read — raw JdbcTemplate или jOOQ — JPA отличен для CRUD, хуже для сложной аналитики.

Типичные ошибки

Ловушки Методы запросов: N+1 queries (lazy loading в цикле); EAGER на каждом relation (огромные cascading joins); @Transactional на private/self-invocation (proxy не intercept-ит — аннотация ничего не делает); auto-DDL (spring.jpa.hibernate.ddl-auto=update) в prod (тихий + опасный schema drift).

Связанные понятия

Полезные ресурсы

Проверить знания (1)

Загрузка вопросов…