如何通过JPA查询在同一字段中选择可变数量的相似字符串?

时间:2018-06-27 15:26:30

标签: java sql spring spring-data-jpa jpql

我想在春季使用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。

1 个答案:

答案 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中实现相同的目的。