Spring的Pageable分页剖析

2019-10-14  本文已影响0人  自由主义者

PageRequest extends AbstractPageRequest 而 AbstractPageRequset implements Pageable

first:

写一个接受分页参数的PageRequest类(工具类)(这样就不用自己去写get、set等方法),当然也可以不写,直接使用对应的参数去接收(Controller层)

    public static PageRequest getGridPageParams() {
        int pageNumber = 0;
        int pageSize = 20;
        HttpServletRequest request = ServiceUtil.getRequest();
        String P_pageNumber = request.getParameter("P_pageNumber");
        String P_pagesize = request.getParameter("P_pagesize");
        String order = request.getParameter("P_orders");
        String stringDirection = request.getParameter("sord");
        PageRequest pageRequest = null;
        if (null != P_pageNumber) {
            pageNumber = Integer.parseInt(P_pageNumber) - 1;
        }
        if (null != P_pagesize) {
            pageSize = Integer.parseInt(P_pagesize);
        }
        if (order != null && stringDirection != null) {
            Direction direction = Direction.fromString(stringDirection);
            Sort sort = new Sort(direction, order);
            pageRequest = new PageRequest(pageNumber, pageSize, sort);
            return pageRequest;
        }
        pageRequest = new PageRequest(pageNumber, pageSize);
        return pageRequest;
    }   

second:

将分页参数传给真正的spring进行管理

    @GetMapping("/list")
    @ResponseBody
    public CommonAjaxResult getDappKindList(DappKind dappKind) {
        Pageable pageable = PageUtil.getGridPageParams();//获得封装的分页data
        Sort sort = new Sort(Sort.Direction.DESC, "createTime");
        Pageable page = PageRequest.of(pageable.getPageNumber(), pageable.getPageSize(), sort);
        Page result = dappKindService.findByPage(dappKind, page);//调service层
        PageVo pageVo = PageUtil.parseFromPage(result);//方法如下(更友好的显示给前端)
        if(null != pageVo){
            return CommonAjaxResult.success(pageVo);
        }
        return CommonAjaxResult.error("获取列表失败,请稍后再试");
    }
    public static PageVo parseFromPage(Page page) {
        PageVo pageVo = new PageVo();
        pageVo.setData(page.getContent());
        pageVo.setPageNumber(page.getNumber() + 1);
        pageVo.setPageSize(page.getSize());
        pageVo.setTotal(page.getTotalElements());
        pageVo.setTotalPages(page.getTotalPages());
        return pageVo;
    }

third:

在service层中进行查询条件的处理

   public Page findByPage(DappKind dappKind, Pageable pageable) {
       Specification<DappKind> specification = getWhereClause(dappKind);
       return dappKindRepository.findAll(specification, pageable);//调jpa中方法
   }

   /**
    * 查询条件的处理
    */
   private Specification<DappKind> getWhereClause(final DappKind dappKind) {
       return new Specification<DappKind>() {
           @Override
           public Predicate toPredicate(Root<DappKind> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
               List<Predicate> list = new ArrayList<>();
               if (StringUtils.isNotBlank(dappKind.getId())) {
                   list.add(cb.equal(root.get("id").as(String.class), dappKind.getId()));
               }
               if (StringUtils.isNotBlank(dappKind.getName())) {
                   list.add(cb.like(root.get("name").as(String.class),  "%" + dappKind.getName() + "%"));
               }
               list.add(cb.equal(root.get("status").as(String.class), DappKind.dappKindStatus.NORMAL));
               Predicate[] p = new Predicate[list.size()];
               return cb.and(list.toArray(p));
           }
       };
   }
Simple Version (需要自己去写SQL(SQL中不需要关注分页参数)Mybatis帮助你实现了分页)
public AjaxResult pageList(Distribute model, Pageable pageable) {
        Page<Distribute> pageObject = distributeService.pageList(param_map, pageable);
}
上一篇下一篇

猜你喜欢

热点阅读