Java 如何使用JPA查询在同一字段中选择数量可变的相似字符串?
为了在同一个字段上找到一组可变的文本(like或query),我正在尝试在spring中使用JPA查询进行like查询 在SQL语言中:Java 如何使用JPA查询在同一字段中选择数量可变的相似字符串?,java,sql,spring,spring-data-jpa,jpql,Java,Sql,Spring,Spring Data Jpa,Jpql,为了在同一个字段上找到一组可变的文本(like或query),我正在尝试在spring中使用JPA查询进行like查询 在SQL语言中: SELECT * FROM A WHERE text LIKE '%A%' OR text LIKE '%B%' OR text LIKE '%C%'.... (Variable number) 在JPA中,它可能与此类似(这不是真正的代码,它是预期工作的主要思想): @Query(“从表t中选择t,其中t.text类似于:setOfTerms”) pag
SELECT * FROM A WHERE text LIKE '%A%' OR text LIKE '%B%' OR text LIKE '%C%'.... (Variable number)
在JPA中,它可能与此类似(这不是真正的代码,它是预期工作的主要思想):
@Query(“从表t中选择t,其中t.text类似于:setOfTerms”)
pagefindtweetsnotparsed(@Param(“setOfTerms”)设置为likequiry,Pageable Pageable);
对于JPA查询,是否有任何技术或方法可以做到这一点
编辑:由于like查询中的错误,我已编辑了该问题。我写了,但我想写 ,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);
您可能需要根据自己的具体需要手工编写regex gen代码
顺便说一句,你可以在Postgres中使用“类似于”操作符实现同样的功能。你使用的是什么数据库服务器?@JoeW我使用的是MySQLSorry我放了什么,我想放在什么地方。我编辑我的问题。对不起,我弄错了。您的解决方案是和喜欢的好解决方案!!谢谢For OR做同样的事情,但使用REGEXP。@Martin更新了一个OR选项,我认为该选项在方向上是正确的。似乎REGEXP不允许作为正常的Spring JPA函数。在这种情况下,您必须在查询文本中设置分页,并设置开始/结束参数。不知道还有别的办法
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);
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.*"