Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/350.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将可变数量的参数传递给Spring Data/Hibernate/JPQL查询_Java_Spring_Hibernate_Spring Data Jpa_Jpa Criteria - Fatal编程技术网

Java 如何将可变数量的参数传递给Spring Data/Hibernate/JPQL查询

Java 如何将可变数量的参数传递给Spring Data/Hibernate/JPQL查询,java,spring,hibernate,spring-data-jpa,jpa-criteria,Java,Spring,Hibernate,Spring Data Jpa,Jpa Criteria,我需要向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 到目前为止,我还不能确定正确的方法是什么。我使用的是Spring4.3.7、Hibernate5.2.

我需要向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

到目前为止,我还不能确定正确的方法是什么。我使用的是Spring4.3.7、Hibernate5.2.9和SpringData1.11.1。我在谷歌上搜索过,似乎没有办法用普通的CRUD回购来实现这一点,但到目前为止,我还没有找到任何与我需要的类似的例子。我认为
CriteriaBuilder
是我应该使用的,但这似乎不受欢迎,所以我不确定正确的方法是什么。

也许您正在寻找类似的东西?:

@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);
@Query(“从实体e中选择e”
+其中(:field1=''或类似“%:field1%”的e.field1)
+和(:field2=''或类似“%:field2%”的e.field2)
//...
+和(:fieldN=''或类似“%:fieldN%”的e.fieldN)
页面高级搜索(@Param(“field1”)字符串field1,
@参数(“字段2”)字符串字段2,
//...
@参数(“字段n”)字符串字段n,
可分页页面);

所以我遵循了@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 + "%");
    }
公共流findProductsContainingDesc(集合使用Desc){
规格=空;
for(字符串s:withDesc){
如果(规格==null){
规格=其中(类描述);
}否则{
规格=规格。或(类似于描述);
}
}
返回internalProductRepository.findAll(specifications.stream();
}
公共静态规范hasDescriptionLike(字符串描述){
return(root,query,builder)->builder.like(root.get(“description”),“%”+desc+“%”;
}
我对回购的定义是这样的

interface InternalProductRepository extends JpaRepository<Product, Long>, JpaSpecificationExecutor 
接口InternalProductRepository扩展了JpaRepository,JpaSpecificationExecutor

添加一个带有类似
@Query注释的
列表查找(stringparam1,stringparam2…)
方法不是很简单吗(“从表格实体y中选择y,其中y.name类似“%:param1%”或y.name类似“%:param2%”……
足够了吗?如果参数的数量未知,我将使用您可以使用JPQL like
SELECT*从表格t中选择,其中t.col1 like%?1%或t.col2 like%?2%或t.col3 like%?3%