Spring Boot Jpa 多條件查詢+排序+分頁
阿新 • • 發佈:2020-08-22
事情有點多,於是快一個月沒寫東西了,今天補上上次說的。
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> {}