Короткий ответ
Spring Data JPA — модуль Spring Framework, работающий поверх спецификации JPA (внутри по умолчанию Hibernate): достаточно объявить интерфейс-репозиторий, и Spring Data сам предоставит его реализацию с готовыми CRUD-операциями — без написания SQL и DAO-классов.
Как это работает подробнее
Центральный интерфейс — JpaRepository, расширяющий CrudRepository и PagingAndSortingRepository. Особенность Spring Data JPA — производные методы запросов (derived query methods): по имени метода, то есть по префиксам findBy, countBy, existsBy, deleteBy и именам полей сущности, Spring Data парсит имя и генерирует нужный JPQL или SQL-запрос.
- Готовые методы:
save(),findById(),findAll(),deleteById(),flush(), а также пагинация черезPageableи сортировка черезSort. - Derived-метод:
findByName(String name)превращается в поиск по полюname, аfindByDepartmentNameстроит запрос через связанную сущность. - @Query: для сложных запросов запрос задаётся вручную на JPQL или нативном SQL при
nativeQuery = true, параметры связываются через@Param. - Дополнительно: поддерживаются пагинация (
Page findAll(Pageable)), сортировка и batch-операцияsaveAll().
Пример кода
UserRepository.java
public interface UserRepository extends JpaRepository<User, Long> {
List<User> findByName(String name);
@Query("SELECT u FROM User u WHERE u.email = :email")
Optional<User> findByEmail(@Param("email") String email);
}Что использовать на практике
- Базовые выборки объявляйте derived-методами — это лаконично и читаемо.
- Сложные запросы выносите в
@Queryна JPQL, а для специфики диалекта — в нативный SQL. - Для поиска одного результата возвращайте
Optional, для больших списков используйтеPageиPageable.
Подводные камни
- Имя derived-метода должно точно совпадать с полями сущности: ошибка парсинга имени обнаружится уже при старте контекста Spring.
- Длинные имена вроде
findByDepartmentManagerFirstNameухудшают читаемость — лучше@Query. - Если
@Queryвозвращает несколько строк, а метод объявлен какOptional, при выполнении возникнет исключение.
Как отвечать на собеседовании
- Назовите цель Spring Data JPA — убрать ручной слой DAO и SQL → покажите интерфейс, наследующий JpaRepository → объясните, что реализацию Spring создаёт сам → разберите, как имя derived-метода превращается в запрос → добавьте @Query и nativeQuery = true → упомяните пагинацию Pageable и Sort.