В каком контексте вы использовали Spring Data JPA
Criteria APIJavaSpring Data JPAспецификации
Что проверяют
Работали ли вы с JPA дальше репозиториев с автогенерируемыми методами. Следом почти всегда спрашивают про N+1 и транзакции, так что о них стоит сказать самому.
Как отвечать
Опишите задачу и как выглядел слой доступа к данным: сущности с @Entity, репозитории поверх JpaRepository, чем пользовались из возможностей:
- методы по имени:
findByUserIdAndStatus, удобно, пока имя читается; @Queryс JPQL или нативным SQL там, где выражение сложное;- проекции и DTO: интерфейсные проекции или конструктор в запросе, чтобы не тянуть всю сущность ради двух полей;
- пагинация и сортировка через
Pageable, с оговоркой, чтоcount-запрос на больших таблицах стоит денег; Specificationили Querydsl для динамических фильтров.
Дальше покажите понимание подводных камней, это и есть содержание ответа:
- N+1 запросов: ленивые связи внутри цикла. Лечится
join fetch,@EntityGraphили отдельным запросом. Обнаруживается логом SQL и счётчиком запросов в тестах; - транзакции:
@Transactionalна сервисе, а не на репозитории, понимание того, что внутри транзакции сущность управляемая и её изменения улетают в базу без явногоsave; - ленивая загрузка вне транзакции:
LazyInitializationExceptionи почему открывать сессию на весь запрос это не решение; - пакетные операции:
saveAllбез настройки батчей всё равно шлёт по запросу на строку; - миграции схемы: Liquibase или Flyway, а
ddl-autoтолько для локальной разработки.
Где спотыкаются
Не могут объяснить разницу между save для новой и для управляемой сущности.
Ставят FetchType.EAGER на все связи и получают тяжёлые запросы вместо N+1.
Считают JPA заменой знанию SQL. На собеседовании это выясняется первым же вопросом про план запроса.