Spring Data Jpa предоставляет аннотации, которыми можно…задавать собственные запросы. Да да, ещё один метод 🙂
Код примеров ниже основан на коде из статьи Hello, Spring Data JPA
@Query
Аннотация @Query позволяет добавить свой собственный JPQL запрос.
1
2
|
@Query("select p from Passport p where p.owner.lastName like ?1%")
Iterable<Passport> ownerStartsWith(String name);
|
В запросах можно использовать и именованные параметры, хотя и с несколько неуклюжим синтаксисом:
1
2
|
@Query("select p from Passport p where p.owner.lastName = :name")
Iterable<Passport> findByOwner(@Param("name") String name);
|
Spring Expression Language
А ещё в @Query можно использовать выражения и подстановки SpEL:
1
2
|
@Query("select p from Person p where p.passport.series = :#{#passport.series}")
Iterable<Person> personWithPasportSeries(@Param("passport") Passport series);
|
Spring Data Jpa добавляет свою собственную переменную, #{#entityName}, которая разворачивается в имя сущности, которой типизирован репозиторий.
Query hints
Используя аннотацию @QueryHints можно добавлять Jpa query hints (и hibernate query hints и вообще любые query hints любых реализаций) к любому запросу:
1
2
3
|
@QueryHints(@QueryHint(name = "org.hibernate.readOnly", value = "true"))
@Query("select p from Passport p where p.owner.lastName = :name")
Iterable<Passport> findByOwner(@Param("name") String name);
|
Код примера доступен на github