Ответ
Аннотация @Query в Spring Data JPA поддерживает несколько типов синтаксиса запросов:
-
JPQL (Java Persistence Query Language) — синтаксис по умолчанию. Работает с сущностями и их атрибутами.
@Query("SELECT u FROM User u WHERE u.email = ?1") User findByEmail(String email); -
Нативный SQL (Native SQL). Требует явного указания
nativeQuery = true. Работает напрямую с таблицами и колонками БД.@Query(value = "SELECT * FROM users WHERE email = :email", nativeQuery = true) User findByEmailNative(@Param("email") String email); -
Именованные параметры. Более безопасный и читаемый способ передачи параметров, чем позиционные (
?1).@Query("SELECT u FROM User u WHERE u.name = :name AND u.age > :minAge") List<User> findUsersByNameAndMinAge(@Param("name") String name, @Param("minAge") int minAge); -
SpEL (Spring Expression Language) выражения. Позволяют использовать динамические части в запросе, например, имя сущности.
@Query("SELECT u FROM #{#entityName} u WHERE u.deleted = false") List<User> findAllActive(); -
Модифицирующие запросы (UPDATE, DELETE). Требуют дополнительной аннотации
@Modifyingи, как правило, выполнения в транзакции.@Modifying @Transactional @Query("UPDATE User u SET u.status = :status WHERE u.id = :id") int updateUserStatus(@Param("status") String status, @Param("id") Long id);