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