@Query

Базовый Spring
≈ 1 мин чтения

Когда запрос лучше написать явно

Если условие уже плохо помещается в имя метода, запрос можно привязать к методу через @Query. По умолчанию строка внутри аннотации — это JPQL, поэтому в ней используются имена сущностей и их полей, а не названия таблиц и столбцов базы данных.

interface CustomerRepository extends JpaRepository<Customer, Long> {
    @Query("""
            select c
            from Customer c
            where c.active = true
              and c.age >= :minAge
            order by c.name
            """)
    List<Customer> findActiveAdults(@Param("minAge") int minAge);
}

Параметр :minAge связан с аргументом метода через @Param. Такое объявление удобно читать: контракт метода остаётся в репозитории, а сам запрос виден целиком и не превращается в длинную последовательность слов в имени.

JPQL и native SQL — разные уровни

Для большинства запросов к сущностям удобно оставаться на уровне JPQL. Но @Query также может выполнять native SQL, если нужна возможность конкретной базы данных или запрос проще выразить непосредственно через таблицы. Тогда запрос уже зависит от реальной схемы и SQL-диалекта сильнее, чем обычный JPQL.

@Query не делает строку запроса безопасной для произвольной подстановки текста. Значения передавайте параметрами, как в примере, а не собирайте запрос конкатенацией пользовательского ввода.