JPA单独搜索一列中的多个单词

qnzebej0  于 5个月前  发布在  其他
关注(0)|答案(2)|浏览(39)

有没有一种方法可以在一个列中单独搜索多个单词-比如:

@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

fykwrbwg

fykwrbwg1#

是的,您可以通过使用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));

tquggr8v

tquggr8v2#

如果你不想使用Criteria API,你也可以使用REGEXP。你必须在将列表传递到仓库之前加入列表,就像Kotlin中那样:

val joinedWords = words.joinToString(separator = "|")

字符串
现在你可以像这样在查询中使用它。

SELECT a 
FROM Article a 
WHERE a.text REGEXP :joinedWords

相关问题