当前位置: 首页 > 知识库问答 >
问题:

Spring Data JPA-如何在同一列上使用多个值实现LIKE搜索[重复]

罗建弼
2023-03-14

假设我有下表,

电影_标题

    < li >蝙蝠侠前传 < li >蝙蝠侠归来 <李>绝地归来 <李>魔戒:王者归来 恋爱中的莎士比亚 《死亡诗社》 < li >死池 < li >魔戒:魔戒之友

我想对电影标题进行搜索,并传递逗号分隔的值(使用多个关键字进行搜索)

举个例子,

搜索文本:蝙蝠侠结果:记录#1,2

搜索文本: 蝙蝠侠, 返回结果: 记录 #1,2,3,4

搜索文本: 主, 爱 的结果: 记录 #4,5,8

如果没有对每个关键字进行循环,是否可以在一次调用中使用Spring数据JPA中的 LIKE搜索(或其他内容)来实现?

谢谢

共有2个答案

鲜于华容
2023-03-14

如果您真的不想在循环中组合多个 LIKE,则可以使用正则表达式。但是,T-SQL 中没有标准的正则表达式匹配,但有依赖于数据库的解决方案。

例如,在Postgres中,您可以使用< code>~*操作符来匹配正则表达式列

sql> select 'The Lord of the Rings: The Return of the King' ~* '(King|Queen|Princess|Lord|Duke|Baron)'
[2020-06-03 14:09:28] 1 row retrieved

当然,在查询之前,您需要做一些准备工作。

存储库层:

@Query(value = "select * from Movie_table where movie_title ~* :term", nativeQuery = true)
public List<Object[]> findMovies(@Param("term") String term);

服务层:

String searchText = "Lord, Love";
String searchTerm = Arrays.stream(searchText.split(","))
                    .map(String::trim)
                    .filter(StringUtils::isNotBlank)
                    .collect(Collectors.joining("|", "(", ")"));

List<Object[]> movies = movieRepository.findMovies(searchTerm);
// ... code to convert `Object[]`-s to `Movie` entities ...

附言。与多个like/OR查询相比,此解决方案不太优雅

吴丁雷
2023-03-14

我怀疑你有这样一个实体

@Entity
public class Movie {
   @Id
   Long id;
   String title;

   //getters, setters ...
}

然后您需要存储库扩展JpaSpecificationExecutor

public interface MovieRepository
        extends JpaRepository<Movie, Long>, JpaSpecificationExecutor<Movie> {
}

和规范实用程序类

public class MovieSpecification {
    public static Specification<Movie> titleContains(String searchWord) {
        return (root, query, builder) -> {
           Expression<String> titleLowerCase = builder.lower(root.get("title"));
           return builder.like(titleLowerCase, "%" + searchWord.toLowerCase() + "%")
        }
    }
}

在服务层上的用法:

MovieRepository repository;

public List<Movie> getMoviesWhereTitleContainsAnyWord(List<String> words) {
    if(words.isEmpty()) {
        return Collections.emptyList();
    }

    Specification<Movie> specification = null;   
    for(String word : words) {
       Specification<Movie> wordSpecification = MovieSpecification.titleContains(word);
       if(specification == null) {
           specification = wordSpecification;
       } else {
           specification = specification.or(wordSpecification);
       }
    }

    return repository.findAll(specification);
}

传递给该方法的单词越多,由于多个子句,查询速度就越慢。

 类似资料:
  • 本文向大家介绍如何使用MySQL LIKE查询搜索包含%的列值?,包括了如何使用MySQL LIKE查询搜索包含%的列值?的使用技巧和注意事项,需要的朋友参考一下 要使用%搜索列值,语法如下- 让我们首先创建一个表- 使用insert在表中插入一些记录- 使用选择显示表中的所有记录- 这将产生以下输出- 这是使用类似查询的查询来搜索其中包含%的列值的查询- 这将产生以下输出-

  • 问题内容: 我正在构建一个简单的 搜索 算法,我想 用空格 打破我的 字符串 ,并在其上搜索数据库,如下所示: 这可能吗? 问题答案: 是的,您可以使用SQL 运算符来搜索多个绝对值: 如果要使用,则需要改为使用: 使用(如您所尝试的)要求所有条件为真,使用至少需要一个条件为真。

  • 本文向大家介绍Oracle如何实现like多个值的查询,包括了Oracle如何实现like多个值的查询的使用技巧和注意事项,需要的朋友参考一下 问题背景描述: 某天客户有一个需求,给定一批的手机号码或者电话号码,查询出相关的通话记录,以及相关的一些信息。 客户给定的被叫号码如图所示: 查询出来的结果如下图所示(本批次的结果不是上图导入的结果查询的,为了格式说明,因此导入两张结果不相关的图片): 由

  • 问题内容: 我正在尝试提供一种搜索功能,该功能将搜索多列以查找基于关键字的匹配项。该查询: 仅适用于搜索一列,我注意到用逗号分隔列名称会导致错误。那么可以在mysql中搜索多个列吗? 问题答案: 您可以使用AND或OR运算符,具体取决于要返回的搜索内容。 这两个子句必须匹配才能返回记录。或者: 如果任一子句匹配,则将返回记录。 有关使用MySQL SELECT查询可以执行的操作的更多信息,请尝试使

  • 我对蒙哥有点陌生。我想在一个字段上查询多个值。在SQL中,我想要这样的内容: 但这似乎只返回“bar”文档。 请帮忙

  • 问题内容: 我有一个pandas df,并希望按照以下原则(用SQL术语)完成一些工作: 现在,这适用于一个列/值对: 但是,我不确定如何将其扩展为多个列/值对。 为了清楚起见,每一列都匹配一个不同的值。 问题答案: 由于运算符的优先级,您需要将多个条件括在括号中,并使用按位运算符()和(或)和()。 如果使用或,则熊猫可能会抱怨这是模棱两可的。在那种情况下,我们是否要比较条件中一系列的每个值还不