1. введение
Для простых запросов легко определить, каким должен быть запрос , просто посмотрев на соответствующее имя метода в нашем коде.
В этом уроке мы рассмотрим, как Spring Data JPA использует эту идею в виде соглашения об именовании методов.
2. Структура производных методов запроса в Spring
Производные имена методов состоят из двух основных частей, разделенных первой Около ключевое слово:
ListfindByName(String name)
Первая часть – как найти – это интродьюсер , а остальные – как byName – это критерий .
Spring Data JPA поддерживает поиск, чтение, запрос, подсчет и получение . Так, например, мы могли бы сделать queryByName , и данные Spring вели бы себя одинаково.
Мы также можем использовать Distinct, First, или Top для удаления дубликатов или ограничения нашего результирующего набора :
ListfindTop3ByAge()
Часть критериев содержит выражения условий запроса для конкретных сущностей. Мы можем использовать ключевые слова условия вместе с именами свойств сущности. Мы также можем объединить выражения с И и Или, а также увидеть через мгновение.
3. Пример приложения
Во-первых, нам, конечно, понадобится приложение, использующее Spring Data JPA .
В этом приложении давайте определим класс сущностей:
@Table(name = "users") @Entity class User { @Id @GeneratedValue private Integer id; private String name; private Integer age; private ZonedDateTime birthDate; private Boolean active; // standard getters and setters }
И давайте также определим репозиторий. Он расширит JpaRepository, один из типов хранилища данных Spring :
interface UserRepository extends JpaRepository{}
Здесь мы разместим все наши производные методы запроса.
4. Ключевые слова Условия Равенства
Точное равенство является одним из наиболее часто используемых условий в запросах. У нас есть несколько вариантов выражения операторов = или IS в запросе.
Мы можем просто добавить имя свойства без какого-либо ключевого слова для точного условия соответствия:
ListfindByName(String name);
И мы можем добавить Is или Equals для удобства чтения:
ListfindByNameIs(String name); List findByNameEquals(String name);
Эта дополнительная читабельность пригодится, когда нам нужно вместо этого выразить неравенство:
ListfindByNameIsNot(String name);
Это гораздо более читабельно, чем findByName Not(String) !
Поскольку равенство null является частным случаем, мы не должны его использовать. Spring Data JPA обрабатывает нулевые параметры по умолчанию. Поэтому, когда мы передаем значение null для условия равенства, Spring интерпретирует запрос как NULL в сгенерированном SQL.
Мы также можем использовать ключевое слово IsNull для добавления критериев IS NULL в запрос:
ListfindByNameIsNull(); List findByNameIsNotNull();
Обратите внимание, что ни IsNull или IsNotNull требует аргумента метода.
Есть также еще два ключевых слова, которые не требуют никаких аргументов. Мы можем использовать ключевые слова True и False для добавления условий равенства для типов boolean :
ListfindByActiveTrue(); List findByActiveFalse();
Конечно, иногда мы хотим чего-то более мягкого, чем точное равенство, давайте посмотрим, что еще мы можем сделать.
5. Ключевые слова Условия сходства
Когда нам нужно запросить результаты с шаблоном свойства, у нас есть несколько вариантов.
Мы можем найти имена, которые начинаются со значения, используя Начиная с :
ListfindByNameStartingWith(String prefix);
Грубо говоря, это переводится как “ГДЕ имя НАПРИМЕР ‘value%’ “.
Если нам нужны имена, которые заканчиваются значением, то Заканчивается на – это то, что мы хотим:
ListfindByNameEndingWith(String suffix);
Или мы можем найти, какие имена содержат значение с , содержащим :
ListfindByNameContaining(String infix);
Обратите внимание, что все вышеперечисленные условия называются предопределенными шаблонными выражениями. Таким образом, нам не нужно добавлять оператор % внутри аргумента при вызове этих методов.
Но давайте предположим, что мы делаем что-то более сложное. Скажем , нам нужно выбрать пользователей, имена которых начинаются с a , содержат b, и заканчиваются c.
Для этого мы можем добавить свой собственный ЛАЙК с ключевым словом Like :
ListfindByNameLike(String likePattern);
И затем мы можем передать наш подобный шаблон при вызове метода:
String likePattern = "a%b%c"; userRepository.findByNameLike(likePattern);
Пока хватит об именах. Давайте попробуем некоторые другие значения в User.
6. Ключевые слова Условия Сравнения
Кроме того, мы можем использовать ключевые слова Меньше и Меньше, чем Равно для сравнения записей с заданным значением с помощью операторов < и <= :
ListfindByAgeLessThan(Integer age); List findByAgeLessThanEqual(Integer age);
С другой стороны, в противоположной ситуации мы можем использовать Больше, чем и Больше, чем Равно ключевые слова:
ListfindByAgeGreaterThan(Integer age); List findByAgeGreaterThanEqual(Integer age);
Или мы можем найти пользователей в возрасте от двух лет с Между :
ListfindByAgeBetween(Integer startAge, Integer endAge);
Мы также можем предоставить коллекцию возрастов для сопоставления с использованием In :
ListfindByAgeIn(Collection ages);
Поскольку мы знаем даты рождения пользователей, мы можем запросить пользователей, которые родились до или после определенной даты. Для этого мы использовали бы До и После :
ListfindByBirthDateAfter(ZonedDateTime birthDate); List findByBirthDateBefore(ZonedDateTime birthDate);
7. Несколько Выражений Условий
Мы можем объединить столько выражений, сколько нам нужно, используя И и Или ключевые слова:
ListfindByNameOrBirthDate(String name, ZonedDateTime birthDate); List findByNameOrBirthDateAndActive(String name, ZonedDateTime birthDate, Boolean active);
Порядок приоритета – И затем Или, точно так же, как Java.
В то время как Spring Data JPA не накладывает ограничений на количество выражений, которые мы можем добавить, мы не должны сходить с ума здесь. Длинные имена нечитабельны и их трудно поддерживать. Для сложных запросов вместо этого взгляните на аннотацию @Query .
8. Сортировка результатов
Далее идет сортировка. Мы могли бы попросить, чтобы пользователи были отсортированы в алфавитном порядке по их имени с помощью OrderBy :
ListfindByNameOrderByName(String name); List findByNameOrderByNameAsc(String name);
По умолчанию используется сортировка по возрастанию, но вместо этого мы можем использовать Desc для сортировки в обратном порядке:
ListfindByNameOrderByNameDesc(String name);
9. findOne против findById в CrudRepository
Команда Spring внесла некоторые серьезные изменения в CrudRepository с помощью Spring Boot 2.x . Один из них-переименование find One в findById.
Ранее с Spring Boot 1.x мы вызывали find One , когда хотели получить объект по его первичному ключу:
User user = userRepository.findOne(1);
Начиная с Spring Boot 2.x мы можем сделать то же самое с findById :
User user = userRepository.findById(1);
Обратите внимание, что метод findById() уже определен в CrudRepository для нас. Поэтому нам не нужно явно определять его в пользовательских репозиториях, которые расширяют CrudRepository .
10. Заключение
В этой статье мы объяснили механизм вывода запросов в Spring Data JPA. Мы использовали ключевые слова условия свойства для написания производных методов запроса в репозиториях Spring Data JPA.
Исходный код этого учебника доступен в проекте Github .