有没有一种方法可以在一个列中单独搜索多个单词-比如:
@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。
ArrayList<String> words
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>的存储库上执行:
JpaSpecificationExecutor<Article>
List<String> words = ...; //your logic to get words List<Article> matches = articleRepository.findAll(forWords(words));
型
tquggr8v2#
如果你不想使用Criteria API,你也可以使用REGEXP。你必须在将列表传递到仓库之前加入列表,就像Kotlin中那样:
REGEXP
val joinedWords = words.joinToString(separator = "|")
字符串现在你可以像这样在查询中使用它。
SELECT a FROM Article a WHERE a.text REGEXP :joinedWords
2条答案
按热度按时间fykwrbwg1#
是的,您可以通过使用Criteria API构建动态查询来实现这一点。
您的规范可能如下所示:
字符串
然后它可以在启用
JpaSpecificationExecutor<Article>
的存储库上执行:型
tquggr8v2#
如果你不想使用Criteria API,你也可以使用
REGEXP
。你必须在将列表传递到仓库之前加入列表,就像Kotlin中那样:字符串
现在你可以像这样在查询中使用它。
型