Продвинутый поиск пользователей в Spring JPA через LIKE

Пройдите тест, узнайте какой профессии подходите

Я предпочитаю
0%
Работать самостоятельно и не зависеть от других
Работать в команде и рассчитывать на помощь коллег
Организовывать и контролировать процесс работы

Быстрый ответ

Spring JPA's @Query позволяет применять оператор LIKE для поиска данных:

Java
Скопировать код
@Query("SELECT u FROM User u WHERE u.name LIKE %?1%")
List<User> findBySimilarName(String name);

Передавайте поисковый запрос без правок, и встроенные символы подстановки в JPQL помогут находить частичные совпадения словно волшебством!

Кинга Идем в IT: пошаговый план для смены профессии

Реализация пользовательских запросов с оператором LIKE и аннотацией @Query

С оператором LIKE связаны ключевые особенности, это позволяет формировать заметно более эффективные и гибкие запросы:

1. Динамическое формирование шаблонов через функцию JPQL CONCAT

Функция CONCAT дает возможность динамически создавать шаблоны запросов:

Java
Скопировать код
// Динамическое формирование шаблона поиска.
@Query("SELECT u FROM User u WHERE u.username LIKE CONCAT('%', :username, '%')")
List<User> findByUsernameContaining(@Param("username") String username);

2. Именование в JPQL: использование прописных букв

В JPQL все имена таблиц привязаны к классам сущностей и должны начинаться с прописной буквы:

Java
Скопировать код
// Использование имени класса сущности в запросе.
@Query("SELECT u FROM User u WHERE u.name LIKE %?1%")
List<User> findByNamePattern(String name);

3. Изощренность построения методов в Spring JPA

Spring JPA умеет трансформировать имена методов в запросы к базе данных:

Java
Скопировать код
// Примеры методов, формирующих запросы.
List<User> findUserByUsernameStartingWith(String prefix);
List<User> findUserByUsernameEndingWith(String suffix);
List<User> findUserByUsernameContainingIgnoreCase(String snippet);

4. Поиск уникальных или множественных совпадений

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

Java
Скопировать код
// Поиск имен пользователей по схожести.
@Query("SELECT u FROM User u WHERE u.username LIKE %?1%")
List<User> findUserBySimilarUsername(String username);

5. Упрощение запросов с помощью методов

Для упрощенных запросов рекомендуется использовать методы с описательными именами вместо аннотаций @Query:

Java
Скопировать код
// Примеры методов, заменяющих @Query для простых запросов.
List<User> findUserByUsernameContaining(String substring);

6. Тестирование – гарант успешной разработки

Тестирование необходимо для обнаружения ошибок и предотвращения проблем в дальнейшем:

Java
Скопировать код
// Пример теста, проверяющего количество найденных пользователей.
assertEquals(2, userRepository.findUserBySimilarUsername("smith").size());

7. Поиск без учета регистра

Spring JPA позволяет выполнять поиск данных без учета регистра:

Java
Скопировать код
// Пример метода, игнорирующего регистр при поиске.
List<User> findUserByUsernameContainingIgnoreCase(String substring);

Визуализация

Используя LIKE в Spring JPA, вы будто бы бросаете сеть в океан данных. Ваш шаблон LIKE действует как сеть, а соответствующие данному шаблону данные – это рыбы, которые попадают себе в улов:

Markdown
Скопировать код
Океан данных (🔍): ["Bob", "Jacob", "Jack", "David"]

Шаблон (🗝️): "Ja%"

Улов (🔍🗝️): ["Jacob", "Jack"]

Работа со сложными сценариями

Иногда вам придется выйти за рамки стандартных запросов и проявить творческий подход:

1. Поиск с максимальным охватом

Когда требуется найти данные, соответствующие шаблону в любом месте поля:

Java
Скопировать код
// Поиск по фразе в заголовках постов.
@Query("SELECT p FROM Post p WHERE p.title LIKE %:phrase%")
List<Post> searchByPhrase(@Param("phrase") String phrase);

2. Работа со спецсимволами

Для обработки символов % и _, которые имеют специальное значение в SQL:

Java
Скопировать код
// Добавление символа экранирования для спецсимволов.
@Query("SELECT c FROM Comment c WHERE c.text LIKE ?1 escape '!'")
List<Comment> findByTextContainingSpecialCharacter(String text);

3. Составление сложных шаблонов

Сложные шаблоны требуют точного сочетания символов:

Java
Скопировать код
// Пример сложного запроса с использованием CONCAT.
@Query("SELECT a FROM Article a WHERE a.content LIKE CONCAT(CONCAT('Intro: ', :keyword),'%')")
List<Article> findByIntroKeyword(@Param("keyword") String keyword);

Полезные материалы

  1. Spring Data JPA – Создание запросов
  2. Язык запросов Java Persistence
  3. Spring Data JPA – Производные методы запросов
  4. Spring Data JPA – Использование @Query