JpaSpecificationExecutor接口

JpaSpecificationExecutor

  • 不屬於Repository體系,實現一組JPA Criteria查詢相關的方法
    這裏寫圖片描述
  • Specification:封裝JPA Criteria查詢條件,通常使用匿名內部類的方法來創建改接口的對象
/**
     * 目標: 實現帶查詢條件的分頁. id > 5 的條件
     * 
     * 調用 JpaSpecificationExecutor 的 Page<T> findAll(Specification<T> spec, Pageable pageable);
     * Specification: 封裝了 JPA Criteria 查詢的查詢條件
     * Pageable: 封裝了請求分頁的信息: 例如 pageNo, pageSize, Sort
     */
    @Test
    public void testJpaSpecificationExecutor(){
        int pageNo = 3 - 1;
        int pageSize = 5;
        PageRequest pageable = new PageRequest(pageNo, pageSize);

        //通常使用 Specification 的匿名內部類
        Specification<Person> specification = new Specification<Person>() {
            /**
             * @param *root: 代表查詢的實體類. 
             * @param query: 可以從中可到 Root 對象, 即告知 JPA Criteria 查詢要查詢哪一個實體類. 還可以
             * 來添加查詢條件, 還可以結合 EntityManager 對象得到最終查詢的 TypedQuery 對象. 
             * @param *cb: CriteriaBuilder 對象. 用於創建 Criteria 相關對象的工廠. 當然可以從中獲取到 Predicate 對象
             * @return: *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> page = personRepsotory.findAll(specification, pageable);

        System.out.println("總記錄數: " + page.getTotalElements());
        System.out.println("當前第幾頁: " + (page.getNumber() + 1));
        System.out.println("總頁數: " + page.getTotalPages());
        System.out.println("當前頁面的 List: " + page.getContent());
        System.out.println("當前頁面的記錄數: " + page.getNumberOfElements());
    }
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章