Какие методы используются для поиска данных в Spring Data JPA Repository?

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

Ответ

Spring Data JPA предоставляет несколько механизмов для поиска, от простых до сложных:

  1. Стандартные CRUD-методы: findById(ID id), findAll(), existsById(ID id).

  2. Query Methods (методы по соглашению): Создайте метод в интерфейсе репозитория, и Spring сгенерирует запрос JPQL на основе его имени.

    public interface UserRepository extends JpaRepository<User, Long> {
        // Простой поиск по полю
        List<User> findByLastName(String lastName);
        // Поиск с условиями
        List<User> findByAgeGreaterThan(int age);
        List<User> findByEmailAndActiveTrue(String email);
        // Сортировка и пагинация
        Page<User> findByLastName(String lastName, Pageable pageable);
    }
  3. Аннотация @Query для кастомных JPQL или SQL запросов:

    @Query("SELECT u FROM User u WHERE u.email = :email")
    User findUserByEmail(@Param("email") String email);
    
    @Query(value = "SELECT * FROM users WHERE active = 1", nativeQuery = true)
    List<User> findAllActiveUsersNative();
  4. Specification API и JpaSpecificationExecutor: Для построения динамических, типобезопасных запросов на уровне бизнес-логики.

    public interface UserRepository extends JpaRepository<User, Long>, JpaSpecificationExecutor<User> {}
    // Использование в сервисе:
    List<User> users = userRepository.findAll(
        Specification.where(hasName("John").and(isActive()))
    );

Рекомендация по выбору: Используйте Query Methods для простых запросов, @Query для сложных или оптимизированных, а Specification API — для динамических фильтров.