20200319——十次方 SpringJPA条件/分页查询 五

做完简单的crud,这次变成条件查询
就比如前端可能传来几个模糊字符,进行在数据库中搜查

 @RequestMapping(method = RequestMethod.POST,value = "/search")
    public Result findSearch(@RequestBody Label label){
        List<Label> list = labelService.findSearch(label);
        return new Result(true, StatusCode.OK,"查询成功",list);
    }

post方法,url为/label/search
查询到list,最后把list返回

重点在于service的方法

public List<Label> findSearch(Label label) {
        return labelDao.findAll(new Specification<Label>() {
            @Override
            public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                //where label like %小明%
                List<Predicate> list = new ArrayList<>();
                if(label.getLabelname()!=null && !"".equals(label.getLabelname())){
                   Predicate predicate =  criteriaBuilder.like(root.get("labelname").as(String.class),"%"+label.getLabelname()+"%");
                   list.add(predicate);
                }
//                if(label.getState()!=null && !"".equals(label.getState())){
//                    Predicate predicate =  criteriaBuilder.equal(root.get("state").as(String.class),label.getState());
//                    list.add(predicate);
//                }
                //new一个集合存放所有的条件
                Predicate[] predicates = new Predicate[list.size()];
                predicates = list.toArray(predicates);
                return criteriaBuilder.and(predicates);
            }
        });
    }

首先传入的值的是一个Specification<Label>这样的一个对象,用了匿名内部类,创建一次即可。

public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder)

root是传入的label主题,criteriaQuery没什么用,最后的criteriaBuilder很有用
用来封装条件

最后会封装到一个Predicate predicate这样一个对象,创建一个泛型为该类型的一个集合,把可能前端每个查询条件都写入一个集合,最后把这个集合转成一个数组用 cb.and(arg)传入拼接成查询条件,传给dao接口,dao接口继承了jpa的接口,直接调用内部的数据,完成查询。

分页查询

    @RequestMapping(method = RequestMethod.POST,value = "/search/{page}/{size}")
    public Result pageQuery(@RequestBody Label label,@PathVariable Integer page,@PathVariable Integer size){
        Page<Label> list = labelService.pageQuery(label,page,size);
        return new Result(true, StatusCode.OK,"查询成功",new PageResult<Label>(list.getTotalElements(),list.getContent()));
    }

Controller层没什么特别的,参数多加了size,page,而且返回的是一个叫Page的对象,一会进一步研究一下,还有一个PageResult对象。

 public Page<Label> pageQuery(Label label, Integer page, Integer size) {
        Pageable pageable = PageRequest.of(page-1,size);
        return labelDao.findAll(new Specification<Label>() {
            @Override
            public Predicate toPredicate(Root<Label> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) {
                //where label like %小明%
                List<Predicate> list = new ArrayList<>();
                if(label.getLabelname()!=null && !"".equals(label.getLabelname())){
                    Predicate predicate =  criteriaBuilder.like(root.get("labelname").as(String.class),"%"+label.getLabelname()+"%");
                    list.add(predicate);
                }
//                if(label.getState()!=null && !"".equals(label.getState())){
//                    Predicate predicate =  criteriaBuilder.equal(root.get("state").as(String.class),label.getState());
//                    list.add(predicate);
//                }
                //new一个集合存放所有的条件
                Predicate[] predicates = new Predicate[list.size()];
                predicates = list.toArray(predicates);
                return criteriaBuilder.and(predicates);
            }
        },pageable);
    }

service层比原来多了一个pageble对象

Pageable pageable = PageRequest.of(page-1,size);
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值