15 марта 2023
Тэги: Kotlin, PostgreSQL, rest, Spring Boot, Spring Data, YouTube, руководство.
В предыдущей статье Spring Data JPA, REST и Kotlin: подключение к БД мы рассмотрели как можно подгружать из БД список всех стран, отсортированных по алфавиту и как реализовать постраничный вывод. А в данной статье узнаем, как искать страну по id и по части её названия.
Добавим новый метод в интерфейс CountryService:
Реализация этого метода в CountryServiceImpl будет выглядеть так:
Мы используем стандартный метод findByIdOrNull(), который доступен в нашем репозитории благодаря наследованию от CrudRepository. Этот метод возвращает сущность из БД или null, если записи с таким id не существует. Мы преобразуем полученную сущность с помощью ранее определённого метода расширения CountryEntity.toDto(). Если же мы получим null, то благодаря элвис-оператору кидаем исключение RuntimeException с сообщением о том, что запись не найдена.
В следующих статьях мы научимся делать кастомные исключения, которые могут содержать дополнительную информацию об ошибке.
Теперь добавим новый GET-метод в контроллер:
В аннотации @GetMapping мы указываем шаблон урла, который связан с данным методом. То есть id записи будет передаваться в самом урле. И аннотация @PathVariable связывает его с параметром метода.
Теперь запустим проект и попробуем подгрузить страну по её id. Делаем следующий запрос:
В ответ получим страну с id = 5:
Искать страну по id не очень удобно. Было бы проще искать страны по части названия.
Нам нужно добавить новый метод в репозиторий, опять-таки следуя соглашениям об именовании:
Метод findByNameStartsWithIgnoreCaseOrderByName() ищет страны, у которых название начинается с указанного префикса (первые несколько букв). При этом поиск выполняется регистронезависимый. Все страны, удовлетворяющие условию, сортируются по имени. Более подробно про соглашения об именовании можно почитать в статье Написание запросов в Spring Data JPA. Как и в случае списка всех стран, Spring Data сам сгенерит реализацию данного метода.
Перейдём в сервисный слой и добавим новый метод в CountryService:
Метод search() будет принимать на вход префикс названия страны и возвращать все страны, которые с него начинаются. Реализация этого метода в CountryServiceImpl:
Полученный список сущностей БД мы преобразуем в список dto с помощью метода расширения toDto().
Наконец, добавляем метод поиска searchCountries() в контроллер:
Благодаря аннотации @RequestParam, префикс он принимает как параметр запроса.
Теперь запускаем проект и делаем следующий запрос:
Здесь мы для русских букв «ФР» выполняем url-кодирование. Кстати, на моём сайте есть специальная утилита для этого.
В ответ получим список с единственной страной, которая начинается с этого префикса.
И как видите, регистр букв здесь не важен.
В следующей статье Spring Data JPA, REST и Kotlin: создание, обновление, удаление мы научимся модифицировать записи в базе данных.
Kotlin, Java, Spring, Spring Boot, Spring Data, SQL, PostgreSQL, Oracle, H2, Linux, Hibernate, Collections, Stream API, многопоточность, чат-боты, нейросети, файлы, devops, Docker, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.