SpringData_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());
	}

  


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM