Рубрики
Без рубрики

Производные методы запросов в репозиториях Spring Data JPA

Изучите механизм вывода запросов в Spring Data JPA.

Автор оригинала: baeldung.

1. введение

Для простых запросов легко определить, каким должен быть запрос , просто посмотрев на соответствующее имя метода в нашем коде.

В этом уроке мы рассмотрим, как Spring Data JPA использует эту идею в виде соглашения об именовании методов.

2. Структура производных методов запроса в Spring

Производные имена методов состоят из двух основных частей, разделенных первой Около ключевое слово:

List findByName(String name)

Первая часть – как найти – это интродьюсер , а остальные – как byName – это критерий .

Spring Data JPA поддерживает поиск, чтение, запрос, подсчет и получение . Так, например, мы могли бы сделать queryByName , и данные Spring вели бы себя одинаково.

Мы также можем использовать Distinct, First, или Top для удаления дубликатов или ограничения нашего результирующего набора :

List findTop3ByAge()

Часть критериев содержит выражения условий запроса для конкретных сущностей. Мы можем использовать ключевые слова условия вместе с именами свойств сущности. Мы также можем объединить выражения с И и Или, а также увидеть через мгновение.

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 в запросе.

Мы можем просто добавить имя свойства без какого-либо ключевого слова для точного условия соответствия:

List findByName(String name);

И мы можем добавить Is или Equals для удобства чтения:

List findByNameIs(String name);
List findByNameEquals(String name);

Эта дополнительная читабельность пригодится, когда нам нужно вместо этого выразить неравенство:

List findByNameIsNot(String name);

Это гораздо более читабельно, чем findByName Not(String) !

Поскольку равенство null является частным случаем, мы не должны его использовать. Spring Data JPA обрабатывает нулевые параметры по умолчанию. Поэтому, когда мы передаем значение null для условия равенства, Spring интерпретирует запрос как NULL в сгенерированном SQL.

Мы также можем использовать ключевое слово IsNull для добавления критериев IS NULL в запрос:

List findByNameIsNull();
List findByNameIsNotNull();

Обратите внимание, что ни IsNull или IsNotNull требует аргумента метода.

Есть также еще два ключевых слова, которые не требуют никаких аргументов. Мы можем использовать ключевые слова True и False для добавления условий равенства для типов boolean :

List findByActiveTrue();
List findByActiveFalse();

Конечно, иногда мы хотим чего-то более мягкого, чем точное равенство, давайте посмотрим, что еще мы можем сделать.

5. Ключевые слова Условия сходства

Когда нам нужно запросить результаты с шаблоном свойства, у нас есть несколько вариантов.

Мы можем найти имена, которые начинаются со значения, используя Начиная с :

List findByNameStartingWith(String prefix);

Грубо говоря, это переводится как “ГДЕ имя НАПРИМЕР ‘value%’ “.

Если нам нужны имена, которые заканчиваются значением, то Заканчивается на – это то, что мы хотим:

List findByNameEndingWith(String suffix);

Или мы можем найти, какие имена содержат значение с , содержащим :

List findByNameContaining(String infix);

Обратите внимание, что все вышеперечисленные условия называются предопределенными шаблонными выражениями. Таким образом, нам не нужно добавлять оператор % внутри аргумента при вызове этих методов.

Но давайте предположим, что мы делаем что-то более сложное. Скажем , нам нужно выбрать пользователей, имена которых начинаются с a , содержат b, и заканчиваются c.

Для этого мы можем добавить свой собственный ЛАЙК с ключевым словом Like :

List findByNameLike(String likePattern);

И затем мы можем передать наш подобный шаблон при вызове метода:

String likePattern = "a%b%c";
userRepository.findByNameLike(likePattern);

Пока хватит об именах. Давайте попробуем некоторые другие значения в User.

6. Ключевые слова Условия Сравнения

Кроме того, мы можем использовать ключевые слова Меньше и Меньше, чем Равно для сравнения записей с заданным значением с помощью операторов < и <= :

List findByAgeLessThan(Integer age);
List findByAgeLessThanEqual(Integer age);

С другой стороны, в противоположной ситуации мы можем использовать Больше, чем и Больше, чем Равно ключевые слова:

List findByAgeGreaterThan(Integer age);
List findByAgeGreaterThanEqual(Integer age);

Или мы можем найти пользователей в возрасте от двух лет с Между :

List findByAgeBetween(Integer startAge, Integer endAge);

Мы также можем предоставить коллекцию возрастов для сопоставления с использованием In :

List findByAgeIn(Collection ages);

Поскольку мы знаем даты рождения пользователей, мы можем запросить пользователей, которые родились до или после определенной даты. Для этого мы использовали бы До и После :

List findByBirthDateAfter(ZonedDateTime birthDate);
List findByBirthDateBefore(ZonedDateTime birthDate);

7. Несколько Выражений Условий

Мы можем объединить столько выражений, сколько нам нужно, используя И и Или ключевые слова:

List findByNameOrBirthDate(String name, ZonedDateTime birthDate);
List findByNameOrBirthDateAndActive(String name, ZonedDateTime birthDate, Boolean active);

Порядок приоритета – И затем Или, точно так же, как Java.

В то время как Spring Data JPA не накладывает ограничений на количество выражений, которые мы можем добавить, мы не должны сходить с ума здесь. Длинные имена нечитабельны и их трудно поддерживать. Для сложных запросов вместо этого взгляните на аннотацию @Query .

8. Сортировка результатов

Далее идет сортировка. Мы могли бы попросить, чтобы пользователи были отсортированы в алфавитном порядке по их имени с помощью OrderBy :

List findByNameOrderByName(String name);
List findByNameOrderByNameAsc(String name);

По умолчанию используется сортировка по возрастанию, но вместо этого мы можем использовать Desc для сортировки в обратном порядке:

List findByNameOrderByNameDesc(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 .