在查询后台数据时,有时因为数据太多,需要加一些过滤条件,但是如果过滤条件修改,后台也需要相应的修改对应的判断和拼接查询条件。
Spring Data JPA提供了一个Specification可以用来拼接where之后的条件。
来分别看看CriteriaQuery和CritertiaBuilder分别是用来做什么的。
Spring Data JPA提供了一个入口
数据持久层Repository接口继承JapSpecificationExecutor接口可以直接调用它的方法。
自己写的一个工具类,用来自动装配后台查询条件
public class ParamUtil {
/**
* 如 age = 10 ==> filterType是 "=",name是age,contents是10
* @param cb
* @param filterType 过滤方式 "="等于,">"大于,"<"小于,">="大于等于,"<="小于等于,"%"模糊匹配,">=|<="相当于between
* @param contents 过滤内容
* @param name 过滤对应的实体属性
* @return
*/
public static Predicate filterCondition(CriteriaBuilder cb,String filterType,List<String> contents,Path<String> name){
switch(filterType) {
case "%":
return cb.like(name,contents.get(0)+"%");
case "=":
return cb.equal(name,contents.get(0));
case ">=":
return cb.greaterThanOrEqualTo(name,contents.get(0));
case ">":
return cb.greaterThan(name,contents.get(0));
case "<=":
return cb.lessThanOrEqualTo(name,contents.get(0));
case "<":
return cb.lessThan(name,contents.get(0));
case ">=|<=":
return cb.between(name,contents.get(0),contents.get(1));
default:
return cb.equal(name,contents.get(0));
}
}
}
直接调用JpaSpecificationExecutor,页面定义要过滤的字段和过滤方式。
注意:root.get(key)这里的key要和实体的属性名称一致。