1

我需要将可变数量的参数传递给 spring/JPA repo 来模仿这样的东西。

select * from myTable 
where name like '%SOME_VALUE%'
or name like '%SOME_OTHER_VALUE%'
or name like '%SOME_OTHER_VALUE2%'
or an unknown number of other values

到目前为止,我还无法确定正确的方法是什么。我正在使用 Spring 4.3.7、Hibernate 5.2.9 和 Spring Data 1.11.1。我用谷歌搜索了一下,似乎没有办法用普通的 CRUD 回购来做到这一点,但到目前为止,我还没有找到任何看起来像我需要的例子。我认为CriteriaBuilder这是我应该使用的,但这似乎已经失宠,所以我不确定这样做的正确方法是什么。

4

2 回答 2

1

所以我遵循了@Jorge Campos 的建议并使用了规范。我的代码现在看起来像这样:

    public Stream<Product> findProductsContainingDesc(Collection<String> withDesc) {
        Specifications<Product> specifications = null;
        for (String s : withDesc) {
            if(specifications == null){
                specifications = where(hasDescriptionLike(s));
            }else{
                specifications = specifications.or(hasDescriptionLike(s));
            }
        }
        return internalProductRepository.findAll(specifications).stream();
    }

    public static Specification<Product> hasDescriptionLike(String desc) {
        return (root, query, builder) -> builder.like(root.get("description"), "%" + desc + "%");
    }

我的回购定义是这样的。

interface InternalProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor 
于 2017-04-05T15:24:40.460 回答
0

也许您正在寻找这样的东西?:

@Query("select e from Entity e "
      +"where (:field1 = '' or e.field1 like '%:field1%') "
      +"and (:field2 = '' or e.field2 like '%:field2%') "
      //...
      +"and (:fieldN = '' or e.fieldN like '%:fieldN%')"
Page<Entity> advancedSearch(@Param("field1") String field1,
                           @Param("field2") String field2,
                           //...
                           @Param("fieldN") String fieldN,
                           Pageable page);

来源

于 2017-04-05T11:08:44.580 回答