Получить доступ

Что даёт Spring Data JPA?

MiddleSpring Data JPA и HibernateSpring DataHibernate / JPA
Ещё спрашивают так:
  • Как работают репозитории Spring Data?
  • Как Spring генерирует запрос по имени метода?
Коротко

Объявляете интерфейс, наследующий JpaRepository, — Spring создаёт реализацию с CRUD, пагинацией и сортировкой. Запросы — по имени метода (findByEmailAndStatus), через @Query (JPQL или SQL) или Specification.

  • Методы запросов разбираются при старте — опечатка в имени поля падает сразу
  • Проекции: интерфейсы или DTO вместо сущностей
  • @Modifying для UPDATE/DELETE, @EntityGraph против N+1

А ещё Под капотом — EntityManager и Hibernate; все их ловушки остаются

Так подсказку видит пользователь sotto на живом собеседовании — за пару секунд, пока вы думаете вслух.

Подробно

Репозиторий — интерфейс 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-запрос и читать устаревшие сущности из контекста.

Проверьте себя

Один верный вариант. Подумайте, потом откройте ответ.

Показать варианты и ответ
  • ✓Генерирует реализацию репозитория из интерфейса; запросы выводятся из имени метода (findByEmail) или задаются @Query
  • ✗Заменяет базу данных встроенным хранилищем
  • ✗Требует писать SQL вручную для каждой операции
  • ✗Работает только с NoSQL

Что спросят дальше

  • Как сделать постраничную выборку?
  • Чем JpaRepository отличается от CrudRepository?

Разбор темы

Связанные вопросы

Закрытая бета

Подсказки на собеседовании — в реальном времени

sotto слышит вопрос интервьюера и показывает короткий ответ и план, как в блоке «Коротко». Оставьте контакт — пришлём доступ и промокод.

  • Промокод на 2 часа — сверх пробных 30 минут
  • Программа для Windows — скачать сразу, войти — через Яндекс ID или VK ID
  • Прямая связь с разработчиком: что улучшить — сделаем