我想在春季使用JPA查询进行类似的查询,以便在同一字段上找到一组可变的文本集(例如OR查询)。
使用SQL语言:
SELECT * FROM A WHERE text LIKE '%A%' OR text LIKE '%B%' OR text LIKE '%C%'.... (Variable number)
在JPA中,它可能与此类似(这不是真正的代码,它是预期工作的主要思想):
@Query("SELECT t FROM table t WHERE t.text LIKE :setOfTerms")
Page<Example> findTweetsNotParsed(@Param("setOfTerms") Set<String> likeQuery, Pageable pageable);
JPA查询是否有任何技术或方法?
编辑:由于类似查询中的错误,我已对问题进行了编辑。我写AND,但我想放OR。
答案 0 :(得分:1)
,nativeQuery = true在MySQL中,您可能需要先处理术语集,然后再将其传递给查询,以便生成类似
的内容... text LIKE '%A%B%C%
因此您的示例代码可能变为:
Page<Example> findTweetsNotParsed(Set<String> likeTerms, Pageable pageable) {
return executeTweetsNotParsed(String.join("%", likeTerms),pageable)
}
@Query("SELECT t FROM table t WHERE t.text LIKE :setOfTerms")
Page<Example> executeTweetsNotParsedQuery(@Param("setOfTerms")String likeQuery, Pageable pageable);
对于OR情况,您需要使用REGEXP。像这样:
Page<Example> findTweetsNotParsed(Set<String> likeTerms, Pageable pageable) {
String regex = ".*"+String.join(".*|.*", likeTerms)+".*";
return executeTweetsNotParsed(regex, pageable)
}
@Query(value = "SELECT t FROM table t WHERE t.text REGEXP (:setOfTerms)", nativeQuery=true)
Page<Example> executeTweetsNotParsedQuery(@Param("setOfTerms")String likeQuery, Pageable pageable);
我没有测试过正则表达式,但是如果它是一个纯包含,它应该是这样的,以便您获得类似的查询
... text REGEXP '.*A.*|.*B.*|.*C.*"
您可能需要根据自己的特定需求制作正则表达式gen代码。
顺便说一句,您可以使用SIMILAR TO运算符在Postgres中实现相同的目的。