Что даёт Spring Data JPA?
- Как работают репозитории Spring Data?
- Как Spring генерирует запрос по имени метода?
Объявляете интерфейс, наследующий JpaRepository, — Spring создаёт реализацию с CRUD, пагинацией и сортировкой. Запросы — по имени метода (findByEmailAndStatus), через @Query (JPQL или SQL) или Specification.
- Методы запросов разбираются при старте — опечатка в имени поля падает сразу
- Проекции: интерфейсы или DTO вместо сущностей
- @Modifying для UPDATE/DELETE, @EntityGraph против N+1
А ещё Под капотом — EntityManager и Hibernate; все их ловушки остаются
Подробно
Репозиторий — интерфейс interface OrderRepository extends JpaRepository<Order, Long>. Spring Data создаёт прокси с реализацией: save, findById, findAll(Pageable), deleteById, count.
Запросы:
- по имени метода —
List<Order> findByCustomerIdAndStatusOrderByCreatedAtDesc(long id, Status s): Spring разбирает имя и строит JPQL при старте; - @Query — явный JPQL или
nativeQuery = trueдля SQL; - Specification / Querydsl — динамические фильтры;
- проекции — интерфейс с геттерами или DTO-конструктор: выбрать только нужные поля;
- @Modifying @Query("update ...") — массовые изменения (не забыть
clearAutomatically, иначе контекст устареет).
Что помнить:
saveдля новой сущности —persist, для существующей —merge; внутри транзакции изменения managed-сущности сохраняются и без save;findAll()без пагинации на большой таблице — загрузка всего;- ленивые связи и N+1 —
@EntityGraphили JOIN FETCH; - длинные имена методов нечитаемы — тогда @Query.
Что хотят услышать
- Интерфейс репозитория и сгенерированная реализация.
- Способы описать запрос.
- Проекции и ловушки JPA.
Частые ошибки
- Вызывать findAll() на большой таблице.
- Использовать @Modifying-запрос и читать устаревшие сущности из контекста.
Проверьте себя
Один верный вариант. Подумайте, потом откройте ответ.
Показать варианты и ответ
- ✗Заменяет базу данных встроенным хранилищем, которое синхронизируется с СУБД при старте
- ✗Требует писать SQL вручную для каждой операции, но сам управляет транзакциями
- ✓Генерирует реализацию репозитория; запросы выводит из имени метода или @Query
- ✗Работает только с NoSQL
Что спросят дальше
- Как сделать постраничную выборку?
- Чем JpaRepository отличается от CrudRepository?
Разбор темы
- Spring Data JPA: репозитории и Hibernate
Абстракция репозитория, derived queries и @Query, persistence context и dirty checking, lazy/N+1 и почему DTO, а не entity.
Связанные вопросы
- Что даёт объявление интерфейса, наследующего JpaRepository? Junior
- Список из 100 заказов рендерится вместе с покупателем каждого, и в логе видно 101 SQL-запрос. Какие способы исправят проблему? Middle
- Почему для эндпоинта, отдающего список из тысяч записей, обычно предпочитают проекцию в DTO, а не загрузку сущностей? Middle
Разбор собеседования с sotto
После собеседования sotto разбирает разговор: оценка, каждый вопрос — хорошо, частично или слабо, чего не хватило в ответе и над чем поработать к следующему разу. Первые 30 минут бесплатно.