Java 如何将可变数量的参数传递给Spring Data/Hibernate/JPQL查询
我需要向spring/JPA repo传递数量可变的参数,以模拟类似的情况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.
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 likeSELECT*从表格t中选择,其中t.col1 like%?1%或t.col2 like%?2%或t.col3 like%?3%