javascript
SpringData JPA条件查询、排序、分页查询
前言
在剛開始學習的時候,在dao的定義的接口需要繼承JpaRepository<T, ID>接口和JpaSpecificationExecutor< T >接口,但是一直以來我用到的都只是JpaRepository,用于自動生成相關SQL語句簡化代碼。而JpaSpecificationExecutor給我的感覺就可有可無了,直到最近才發現它的用處,在此記錄一波。因為是學習筆記的關系,所以里面都只是截取關鍵的代碼進行記錄。
正文
要想使用Spring Data JPA,需要在pom.xml中添加以下依賴:
<parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.7.RELEASE</version><relativePath/> <!-- lookup parent from repository --> </parent><dependencies><dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-data-jpa</artifactId></dependency> <dependencies>如前言所說,帶條件的分頁查詢方法是被定義在JpaSpecificationExecutor接口中的,所以這里需要繼承這個接口。
/*** @author Veggie* @date 2019/8/14 - 14:11*/ @Repository public interface MessageRepository extends JpaRepository<Message, Long>, JpaSpecificationExecutor<Message> { }1. 條件查詢
自定義查詢條件的步驟:
root:獲取需要查詢的對象屬性
CriteriaBuilder:構造查詢條件,內部封裝了很多查詢條件(模糊匹配,精準匹配)
當查詢條件用到gt, ge, lt, le, like(分別表示>, >=, <, <=,模糊查詢)時,需要表明查詢對象屬性的類別,如下所示:
//查詢用戶名以"V"開頭的用戶 Predicate like = criteriaBuilder.like(path.as(String.class), "V%");2. 排序
排序用到的是一個Sort類,它是查詢的排序選項(看源碼,有介紹)
它初始化是用到的參數第一個參數:
Sort.Direction.DESC表示降序
Sort.Direction.ASC表示升序
隨后的參數就是要排序的屬性列表,可以有多個參數,也可以直接用List傳,但是至少傳入一個屬性。
Sort sort = new Sort(Sort.Direction.DESC, "id"); //sort作為findAll()方法中的參數,查詢得到得到的結果是經過排序的 List<Message> result = MessageRepository.findAll(sort);3.分頁查詢
分頁需要設置分頁參數類Pageable,初始化主要是有兩個參數:第一個是查詢的頁碼(下標從0開始),第二個是每頁查詢的條數,比如說結果有55條,如果每頁查詢10條,結果就會被分成6頁。也可以添加
注意:原來用到的new PageRequest()已經過時,現在用PageRequest.of()來實現。
Page接口是封裝為Spring Data Jpa 內部的page bean,它的常用方法如下:
//獲取總頁數 int getTotalPages(); //獲取總記錄數 long getTotalElements(); //獲取列表數據 List<T> getContent();分頁查詢的代碼如下:
//設置分頁參數 Pageable pageable = PageRequest.of(0,5); //分頁查詢 Page<Message> page = MessageRepository.findAll(pageable);4. 完整的方法代碼
完整的代碼是以上三個知識點的集合,是帶條件的分頁查詢,查詢得到的結果按id號降序排序。
@RequestMapping(path = "/page")public List<Message> queryPage(@RequestBody Map<String, Object> params) {/*** 自定義查詢條件* 1. 實現Specification接口(提供泛型;查詢的對象類型)* 2. 實現toPredicate方法(構造查詢條件)* 3. 需要借助方法參數中的兩個參數(* root:獲取需要查詢的對象屬性* CriteriaBuilder:構造查詢條件,內部封裝了很多查詢條件(模糊匹配,精準匹配)*/Specification<Message> spec = new Specification<Message>() {@Overridepublic Predicate toPredicate(Root<Message> root, CriteriaQuery<?> query, CriteriaBuilder criteriaBuilder) {Path<Message> path = root.get("receiverName");Predicate equal = criteriaBuilder.equal(path, "Veggie");return equal;}};Integer pageNo = Integer.valueOf((String) params.get("pageNo"));Integer pageSize = Integer.valueOf((String)params.get("pageSize"));/*** 添加排序Sort* Sort.Direction.DESC表示降序* Sort.Direction.ASC表示升序* properties是指實體類的屬性名(不是字段名)*/Sort sort = new Sort(Sort.Direction.ASC, "id");/*** 分頁參數Pageable* 參數1:查詢的頁碼* 參數2:每頁查詢的條數* 參數3:查詢結果的排序規則(可選*/Pageable pageable = PageRequest.of(pageNo, pageSize, sort); //原來的new PageRequest()已經過時/*** 分頁查詢* 參數1:查詢條件Specification* 參數2:分頁參數Pageable*/Page<Message> page = MessageRepository.findAll(spec, pageable);return page.getContent();}感悟
既然都寫博客了,順帶記錄最近學習以及和大佬交談的感悟:
參考資料
總結
以上是生活随笔為你收集整理的SpringData JPA条件查询、排序、分页查询的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: spring boot参数为日期的查询
- 下一篇: Java实现ftp的上传、下载和删除