SpringData学习04

滴水穿石

之前的 Repository 的分页不支持传参,怎么破? ...实现 JpaSpecificationExecutor<T> 接口

 service 层

  /**
     * Specification<T> : 封装了 JPA Criteria 查询的查询条件
     * Pageable : 封装了请求分页的信息
     * */
    public Page<Person> findByJpaSpecificationExecutor(Specification<Person> spec,Pageable pageable){
        return pRepository.findAll(spec, pageable);
    }

单元测试

/**
     * 实现带查询条件的分页
     * */
    @Test
    public void testJpaSpecificationExecutor(){
        int page = 3 - 1;
        int size = 5;
        PageRequest pageable = new PageRequest(page, size);
        
        Specification<Person> spec = new Specification<Person>() {
            /**
             * *root : 代表查询的实体类
             * query : 从中可得到Root对象,即告知JPA Criteria 查询要查询哪一个实体类
             *             还可以用来添加查询条件,
             *             还可以结合EntityManager 对象得到最终查询的 TypedQuery 对象
             * *cb : CriteriaBuilder对象,用于创建 Criteria相关对象的工厂,当然可以从中获取Predicate对象
             * *Predicate : 代表一个查询条件
             * */
            @Override
            public Predicate toPredicate(Root<Person> root, CriteriaQuery<?> query, CriteriaBuilder cb) {
                Path path = root.get("id");
                Predicate predicate = cb.gt(path, 5);
                return predicate;
            }
            
        };
        
        Page<Person> plist = pService.findByJpaSpecificationExecutor(spec, pageable);
        
        System.out.println("总条数: " + plist.getTotalElements());
        System.out.println("总页数: " + plist.getTotalPages());
        System.out.println("当前页数: " + (plist.getNumber()+1));
        System.out.println("当前页面记录数: " + plist.getNumberOfElements());
        System.out.println("当前页面List: " + plist.getContent());
    }
    

测试结果

当前页数 为  21 , "xxx" + 2 + 1 ; 不能忽略呀 要写成 “xxxx” + (2+1) 哦

这个方式工作中肯定是不科学的,需要构建一个通用的Base类。

自定义方法

—————————————————————————————————————————————————————————————————————————

无论如何,心平气和

原文地址:https://www.cnblogs.com/cfb513142804/p/7234397.html