美文网首页Spring 学习Spring
Spring Boot2.0 JPA 实现分页(简单查询分页、复

Spring Boot2.0 JPA 实现分页(简单查询分页、复

作者: 林_Han | 来源:发表于2018-10-19 15:33 被阅读114次

    一、简单分页(只有一个查询条件)

    • 在Repository层将查询语句的返回值类型设置为为Page类型,查询参数中加入Pageable pageable,如:
    @Repository
    public interface SshRepository extends JpaRepository<SshDao, Integer> {
        @Query("select s from ssh s where s.userId = :userId")
        Page<SshDao> selectAllByUserId(@Param("userId") Integer userId, Pageable pageable);
    }
    
    • 在Service层中实例化Pageable对象,并指定currentPage(当前页)、pageSize(每页最大容量),其中PageRequest.of为Spring Boot 2.0的方法,之前版本为new PageRequest(),如:
    public ResultDao getSsh(Integer userId, Integer currentPage, Integer pageSize) {
            // spring boot 2.0推荐写法
            Pageable pageable = PageRequest.of(currentPage,pageSize);
            // spring boot 2.0 以前,2.0版本也适用,但是2.0版本推荐使用上面的方式
            // Pageable pageable = new PageRequest(currentPage,pageSize);
            
            return ResultUtil.unitedResult(ResultEnum.SUCCESS,sshRepository.selectAllByUserId(userId, pageable));
        }
    
    • 在Controller层设置相应的接口,由于currentPage规定从0开始,而前端通常返回的是从1开始,需要同步一下
    @GetMapping("/ssh")
        public ResultDao getSsh(@PathParam("userId") Integer userId,
                                @PathParam("currentPage") Integer currentPage,
                                @PathParam("pageSize") Integer pageSize) {
            // 同步前端传回的当前页参数
            currentPage = currentPage - 1;
            return cloudServerService.getSsh(userId, currentPage, pageSize);
        }
    

    二、多条件查询分页

    多条件查询采用的是以元模型概念为基础的Criteria 查询方法
    • Repository层继承JpaSpecificationExecutor<实体名>,并将返回类型改为Page类型,如:
    @Repository
    public interface CloudServerRepository extends JpaRepository<CloudServerDao, Integer>,JpaSpecificationExecutor<CloudServerDao> {
    }
    
    • 在Service层构建Specification方法,具体实现见代码,同样Spring Boot 2.0和Spring Boot 2.0之前的方法有差异,简单介绍一下各字段的含义:
      • root:查询根,指实体(此处为CloudServerDao),root.get("userId")为获取实体(此处为CloudServerDao)中的字段userId,第二个userId为函数的参数
      • Predicate:定义查询条件。Predicate 对象通过调用CriteriaBuilder的条件方法( equal,notEqual, gt, ge,lt, le,between,like等)创建,具体方法自行搜索

    spring boot 2.0推荐写法
    使用repository的findAll(specification, pageable)查询即可

    // 代码通过userId和key两个条件进行查询
    
    public ResultDao getServer(String key, Integer userId, Integer currentPage, Integer pageSize) {
            Pageable pageable = PageRequest.of(currentPage,pageSize);
            Specification<CloudServerDao> specification = (Specification<CloudServerDao>) (root, query, criteriaBuilder) -> {
                List<Predicate> list = new ArrayList<>();
                // 第一个userId为CloudServerDao中的字段,第二个userId为参数
                Predicate p1 = criteriaBuilder.equal(root.get("userId"),userId);
                list.add(p1);
                if (!key.equals(null)) {
                    // 此处为查询serverName中含有key的数据
                    Predicate p2 = criteriaBuilder.like(root.get("serverName"),"%"+key+"%" );
                    list.add(p2);
                }
                return criteriaBuilder.and(list.toArray(new Predicate[0]));
            };
            return cloudServerRepository.findAll(specification, pageable);
    

    ↓ Spring Boot 2.0之前的写法,Spring Boot 2.0也适用,但是2.0版本推荐使用上面的方式 ↑

    Specification<CloudServerDao> specification = new Specification<CloudServerDao>() {
                public Predicate toPredicate(Root<CloudServerDao> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {
                    List<Predicate> list = new ArrayList<>();
                    Predicate p1 = criteriaBuilder.equal(root.get("userId"),userId);
                    list.add(p1);
                    if (!key.equals(null)) {
                        Predicate p2 = criteriaBuilder.like(root.get("serverName"),"%"+key+"%" );
                        list.add(p2);
                    }
                    return criteriaBuilder.and(list.toArray(new Predicate[0]));
                }
            };
            return cloudServerRepository.findAll(specification, pageable);
    
    
    • 在Controller层设置和简单查询的配置一致
    @GetMapping("/ssh")
        public ResultDao getSsh(@PathParam("userId") Integer userId,
                                @PathParam("currentPage") Integer currentPage,
                                @PathParam("pageSize") Integer pageSize) {
            // 同步前端传回的当前页参数
            currentPage = currentPage - 1;
            return cloudServerService.getSsh(userId, currentPage, pageSize);
        }
    

    相关文章

      网友评论

      本文标题:Spring Boot2.0 JPA 实现分页(简单查询分页、复

      本文链接:https://www.haomeiwen.com/subject/myayzftx.html