Spring Boot Jpa 多條件查詢+排序+分頁


  事情有點多,於是快一個月沒寫東西了,今天補上上次說的。

  JPA是Java Persistence API的簡稱,中文名Java持久層API,是JDK 5.0注解或XML描述對象-關系表的映射關系,並將運行期的實體對象持久化到數據庫中。  Sun引入新的JPA ORM規范出於兩個原因:其一,簡化現有Java EE和Java SE應用開發工作;其二,Sun希望整合ORM技術,實現天下歸一。---百度百科
  以上是官方的說法,我的理解呢,就是說jpa可以讓與數據庫相關的操作變得更簡單的*瓜式操作,有現成的CRUD接口供你調用,整個過程行雲流水非常簡單,不用寫SQL,代碼簡單,面向對象,還不用擔心SQL注入的安全問題。
那么簡單的操作呢,這里就不說了,就寫一下簡單中復雜一點的操作---多條件動態查詢+分頁+排序。這個查詢呢只是單表查詢,而至於多表關聯呢,目前我還是用視圖,暫時沒有想到更好的辦法,還在學習中。等我學會了一定寫出來。
 
1、Utils.java工具類中的方法  
 
 1 /** 
2
* 獲取Sort 3 * 4 * @param direction - 排序方向 5 * @param column - 用於排序的字段 6 */ 7 public static Sort getSort(String direction,String column){ 8 Sort sort = null; 9 if(column == null || column == "") return null; 10 if(direction.equals("asc")||direction.equals("ASC")){ 11 sort = Sort.by(Sort.Direction.ASC,column); 12 }else { 13 sort = Sort.by(Sort.Direction.DESC,column); 14 } 15 return sort; 16 } 17 /** 18 * 獲取分頁 19 * @param pageNumber 當前頁 20 * @param pageSize 頁面大小 21 * @param sort 排序;sort為空則不排序只分頁 22 * @return 分頁對象 23 */ 24 public static Pageable getPageable(int pageNumber,int pageSize,Sort sort){ 25 if(sort!=null){ 26 return PageRequest.of(pageNumber,pageSize,sort); 27 } 28 return PageRequest.of(pageNumber,pageSize); 29 } 30 /** 31 * 判斷String是否為空 32 * @param str 33 * @return 34 */ 35 private static boolean isEmpty(String str){ 36 if(str.equals(null)||str.equals("")) return true; 37 return false; 38 }

2、實現類

這里查詢相關參數是前端傳的,我懶,所以用默認值了,查詢條件可以是多條件動態,排序也可以是動態的,只要傳排序字段和排序方向對號入座即可。

 1 @Override  2 public Page<User> findAll() {  3     // 創建測試對象
 4     User user = new User();  5     user.setName("1");  6     Sort sort = Utils.getSort("asc","name");  7     Pageable pageable = Utils.getPageable(0,5,sort);  8     // 調用組裝查詢條件方法
 9     Specification<User> spec = getSpecification(user); 10     return userRepository.findAll(spec,pageable); 11 } 12 
13 /**
14  * 組裝查詢條件 15  * @param user -查詢相關對象 16  * @return 返回組裝過的多查詢條件 17  */
18 private Specification<User> getSpecification(User user) { 19     Specification<User> specification = new Specification<User>() { 20  @Override 21         public Predicate toPredicate(Root<User> root, CriteriaQuery<?> criteriaQuery, CriteriaBuilder criteriaBuilder) { 22             List<Predicate> predicates = new ArrayList<>(); 23             // 判斷條件不為空
24             if(!Utils.isEmpty(user.getName())){ 25                 predicates.add(criteriaBuilder.like(root.get("name"),user.getName())); 26  } 27             return criteriaQuery.where(predicates.toArray(new Predicate[predicates.size()])).getRestriction(); 28  } 29  }; 30     return specification; 31 }

 3.repository類中需要這么干

1 @Repository 2 public interface UserRepository extends JpaRepository<User, Integer>, JpaSpecificationExecutor<User> {}

 

 

 


免責聲明!

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



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