JPA отдельно для поиска нескольких слов в одном столбце - PullRequest
0 голосов
/ 10 июля 2019

Есть ли способ поиска нескольких слов по отдельности в столбце - что-то вроде:

@Query("SELECT a FROM Article a WHERE LOWER(a.text) LIKE LOWER(CONCAT('%',:word1,'%')) AND LOWER(a.text) LIKE LOWER(CONCAT('%',:word2,'%'))")

Но для работы с несколькими словами ArrayList<String> words.

1 Ответ

1 голос
/ 10 июля 2019

Да, вы можете достичь этого, построив динамический запрос с использованием Criteria API.

Ваша спецификация может выглядеть следующим образом:

Specification<Article> forWords(Collection<String> words) {
    if(words == null || words.isEmpty())
        throw new RuntimeException("List of words cannot be empty.");

    return (root, query, builder) -> words.stream()
            .map(String::toLowerCase)
            .map(word -> "%" + word + "%")
            .map(word -> builder.like(builder.lower(root.get("text")), word))
            .reduce(builder::or)
            .get();

}

и затем его можно выполнить в JpaSpecificationExecutor<Article> -подключенном репозитории:

List<String> words = ...; //your logic to get words
List<Article> matches = articleRepository.findAll(forWords(words));
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...