【问题标题】:Search all columns for matching keyword with Spring JPA使用 Spring JPA 在所有列中搜索匹配关键字
【发布时间】:2019-11-04 10:38:04
【问题描述】:

我正在使用 Spring Boot 构建一个休息服务。我一直在使用 Spring Data JPA 进行查询,但我愿意接受任何有助于解决我的问题的方法。

我想在数据库中的任意列中查找具有匹配字符串的所有条目。

类似FindAllBy(all 20 columns)(String parameter)SELECT * FROM AllColumns() WHERE parameter = "Foo";

我有一个具有近 20 个属性的实体,所以我想避免在搜索中写入所有列名。

我该怎么做?

【问题讨论】:

  • spring data jps 没有任何方法可以做到这一点。你必须写一个查询
  • @pvpkiran 查询是否可以通过某种方式搜索所有列?
  • 据我所知没有
  • 这能回答你的问题吗? Spring Data - Multi-column searches

标签: spring spring-boot jpa spring-data-jpa


【解决方案1】:

这个 URL (https://www.baeldung.com/rest-api-search-language-spring-data-specifications) 会帮助你,我从 URL 中复制了一些代码来解释你。

您需要定义一个标准类

public class SearchCriteria {
    private String column;
    private String operation;
    private Object value;
}

那么你需要定义你的搜索规范

public class SearchSpecification implements Specification<MyEntity> {

    private SearchCriteria criteria;

    private SearchSpecification(SearchCriteria criteria){
        this.criteria =criteria;
    }

    @Override
    public Predicate toPredicate
      (Root<User> root, CriteriaQuery<?> query, CriteriaBuilder builder) {


        if (criteria.getOperation().equalsIgnoreCase(":")) {
            if (root.get(criteria.getColumn()).getJavaType() == String.class) {
                return builder.like(
                  root.<String>get(criteria.getColumn()), "%" + criteria.getValue() + "%");
            } 
        }
        return null;
    }
}

最后你可以通过扩展 JpaSpecificationExecuto 来修改你的存储库r

public interface MyRepository 
  extends JpaRepository<User, Long>, JpaSpecificationExecutor<MyEntity> {}

现在您可以为每列创建一个规范为您的案例所有二十列

SearchSpecification spec1 = 
              new SearchSpecification(new SearchCriteria("column1", ":", "searchVal"));

SearchSpecification spec2 = 
              new SearchSpecification(new SearchCriteria("column2", ":", "searchVal"));

SearchSpecification spec3 = 
              new SearchSpecification(new SearchCriteria("column3", ":", "searchVal"));

那么你需要像这样执行查询

List<MyEntity> results = 
      repository.findAll(Specification.where(spec1).or(spec2).or(spec3));

【讨论】:

    【解决方案2】:

    是在所有列中搜索字符串的唯一方法 从您的表中选择 * WHERE field1 LIKE '%value%' 或 field2 LIKE '%value%' ......;

    【讨论】:

      猜你喜欢
      • 2015-05-05
      • 2012-09-20
      • 1970-01-01
      • 2021-08-07
      • 1970-01-01
      • 1970-01-01
      • 2017-11-05
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多