Spring data jpa 分頁技術

今天項目後臺須要使用分頁技術查詢關係庫,故蒐集了一些資料研究了一下,整理以下: spring

一、以前的Repository接口都繼承了CRUDRepository,若是但願倉庫提供分頁和排序方法,能夠繼承接口PagingAndSortingRepository接口。它提供了兩個默認方法: 編程

  • findAll(Sort)使用Sort提供的排序指令對全部實體進行排序查詢,返回Iterable<T>;
  • findAll(Pageable)使用Pageable中的Sort對象對實體排序查詢,並使用Pageable的getPageSize()(每頁的元素個數)和getPageNumber()(想要得到的頁序號)兩個方法返回的值返回分頁的對象:Page<T>。

Sort對象指定了對實體的哪幾個屬性進行排序,和排序方向(ASC默認升序,DESC降序);Page<T>很強大,不只包含了數據自己,還包含是否是第一頁或是否是最後一頁以及一共多少頁等。 函數


二、若是不使用上述函數,咱們的Repository沒必要繼承PagingAndSortingRepository接口。能夠像以前那樣繼承CRUDRepository,在須要使用分頁技術的函數中添加一個Pageable參數,並把返回值設爲Page<T>便可。例如 學習

Page<T> findByAddress(String address, Pageable page); 測試

或者加入Sort參數,把返回值設置爲Iterable<T>。 spa


三、在Web應用中,一般不須要本身建立Pageable對象,Spring Data提供了兩個HandlerMethodArgumentResolver實現: 對象

PageableHandlerMethodArgumentResolver和SortHandlerMethodArgumentResolver,它們能夠將HTTP請求參數轉換爲Pageable和Sort對象。 排序

我使用的是編程的方式配置spring,在相應的WebMvcConfigurerAdapter繼承類上使用@EnableSpringDataWebSupport註解,它將註冊上文提到的兩個MethodArgumentResolver,用於將請求參數轉換爲Pageable和Sort對象。 繼承

經過@EnableSpringDataWebSupport註解註冊的兩個bean包含了一些默認設置,包括解析的參數名稱等。若是這些不知足需求,能夠去掉該註解,覆蓋WebMvcConfigurerAdapter的addArgumentResolvers(List<HandlerMethodArgumentResolver>)方法,本身建立上述兩個Resolver並設置他們的屬性,具體配置參考Spring data API吧。 接口


四、最後是參數轉換規則,默認的Pageable pageNumber屬性對應的參數名是page(頁數從0開始,即page=2查詢的是第三頁), pageSize對應的參數名是size,Sort對象對應的參數名是sort。通過我本身測試sort參數的格式是 「屬性名,...,ASC/DESC」。即前面指定一個或者多個排序的屬性,最後指定方向,都用逗號分隔,若是不指定排序方向默認是ASC。可能有些抽象,來看一個例子:

對於User實體,每頁10個User,查詢第3頁,按id屬性降序排列的參數能夠這麼寫:

......../users?size=10&page=2&sort=id,desc


後記:上網蒐集資料時發現,討論分頁技術的相關文章不是不少且大多數不夠深刻,用編程方式配置Spring的更是少之又少。像是sort參數的格式,沒有找到相關的文章、API中也沒找到,是本身試出來的,寫的不必定全面,歡迎你們在帖子下面討論一下,相互學習。

相關文章
相關標籤/搜索