Ответ
Spring Data JPA предоставляет несколько механизмов для поиска, от простых до сложных:
-
Стандартные CRUD-методы:
findById(ID id),findAll(),existsById(ID id). -
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); } -
Аннотация
@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(); -
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 — для динамических фильтров.