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, Linux, Hibernate, Collections, Stream API, многопоточность, файлы, Nginx, Apache, maven, gradle, JUnit, YouTube, новости, руководство, ООП, алгоритмы, головоломки, rest, GraphQL, Excel, XML, json, yaml.