@Query
Когда запрос лучше написать явно
Если условие уже плохо помещается в имя метода, запрос можно привязать к методу через
@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.