Как Spring Data JPA динамически реализует методы репозитория на основе их сигнатур?

«Как Spring Data JPA динамически реализует методы репозитория на основе их сигнатур?» — вопрос из категории Spring, который задают на 10% собеседований Java Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Spring Data JPA использует механизм создания прокси-реализаций во время запуска приложения (через RepositoryFactorySupport). Реализация генерируется на основе парсинга имени метода и создания соответствующего JPQL-запроса или Criteria API.

Пример объявления:

public interface UserRepository extends JpaRepository<User, Long> {
    List<User> findByLastNameAndActiveTrue(String lastName);
    long countByAgeGreaterThan(int age);
}

Принцип работы:

  1. Анализ сигнатуры: Spring разбирает имя метода на части (findBy, LastName, And, ActiveTrue).
  2. Построение запроса: Генерируется JPQL SELECT u FROM User u WHERE u.lastName = ?1 AND u.active = true.
  3. Создание реализации: Во время выполнения создаётся прокси-объект, который выполняет этот запрос через EntityManager.

Ключевые слова в именах методов:

  • Нахождение: findBy, readBy, queryBy, getBy
  • Подсчёт: countBy
  • Удаление: deleteBy, removeBy
  • Условия: And, Or, Between, LessThan, GreaterThan, Like, IgnoreCase, NotNull
  • Сортировка и пагинация: Дополнительные параметры Pageable/Sort.

Важно: Для сложных запросов, которые нельзя выразить через имя метода, используйте аннотацию @Query с явным JPQL.