方便以后查阅加以记录:
spring data 动态条件查询+分页需要继承JpaSpecificationExecutor<T>,直接上代码:
service:
//返回一个Page类型的数组,方法第二个参数就是分页;
public Page<Goods> PageListByGoods(Specification<Goods> spec, Pageable pageable);
serviceImpl:
//我把Specification单独提了出来,重点看pageListWhere方法,
@Override
public Page<Goods> PageListByGoods(Specification<Goods> spec, Pageable pageable){
return goodsRepository.findAll(spec, pageable);
}
/**
* 商品列表筛选查询(分页、排序、条件)
* @param store 关联店铺
* @param type 商品类型
* @param goodsName 商品名
* @param classId 店内商品分类
*/
@Override
public Specification<Goods> pageListWhere(Store store,Integer type, String goodsName,Integer classId){
Specification<Goods> spec = new Specification<Goods>() {
public Predicate toPredicate(Root<Goods> root,
CriteriaQuery<?> query, CriteriaBuilder cb) {
List<Predicate> predicate = new ArrayList<>();
Predicate p = cb.equal(root.get("goods_store").as(Store.class), store);
//根据商品名字筛选
Predicate p1=null;
if(goodsName!=null && !goodsName.equals("")){
p1 = cb.like(root.get("goods_name"), "%"+goodsName+"%");
}
Predicate p2=null;
if(type!=null && type==1){
//查询线上
p2 = cb.equal(root.get("goods_choice_type"), 0);
}
Predicate p3=null;
if(type!=null && type==2){
//查询线下
p3 =cb.equal(root.get("goods_choice_type"), 1);
}
In<Integer> in=null;
if(classId!=null && classId!=0){
List<Object> list =userGoodsClassRepository.listBySQL("select goods_id from t_goods_ugc where class_id="+classId);
in = cb.in(root.<Integer> get("id"));
for (Object id : list) {
in.value(StringUtils.null2Int(id));
}
}
Predicate p4 =in;
//把Predicate应用到CriteriaQuery中去,因为还可以给CriteriaQuery添加其他的功能,比如排序、分组啥的
Predicate preA = null;
if(null!=p){
Predicate preS =cb.and(p);
predicate.add(preS);
}
if(null!=p1){
preA =cb.and(p1);
predicate.add(preA);
}
if(null!=p2){
preA =cb.and(p2);
predicate.add(preA);
}
if(null!=p3){
preA =cb.and(p3);
predicate.add(preA);
}
if(null!=p4){
preA =cb.and(p4);
predicate.add(preA);
}
Predicate[] pre = new Predicate[predicate.size()];
//添加排序的功能
query.where(predicate.toArray(pre));
query.orderBy(cb.desc(root.get("goods_salenum")));
return query.getRestriction();
}
};
return spec;
}