Какой синтаксис можно использовать с аннотацией @Query в Spring Data JPA?

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

Ответ

Аннотация @Query в Spring Data JPA поддерживает несколько типов синтаксиса запросов:

  1. JPQL (Java Persistence Query Language) — синтаксис по умолчанию. Работает с сущностями и их атрибутами.

    @Query("SELECT u FROM User u WHERE u.email = ?1")
    User findByEmail(String email);
  2. Нативный SQL (Native SQL). Требует явного указания nativeQuery = true. Работает напрямую с таблицами и колонками БД.

    @Query(value = "SELECT * FROM users WHERE email = :email", nativeQuery = true)
    User findByEmailNative(@Param("email") String email);
  3. Именованные параметры. Более безопасный и читаемый способ передачи параметров, чем позиционные (?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);
  4. SpEL (Spring Expression Language) выражения. Позволяют использовать динамические части в запросе, например, имя сущности.

    @Query("SELECT u FROM #{#entityName} u WHERE u.deleted = false")
    List<User> findAllActive();
  5. Модифицирующие запросы (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);