Spring?JPA?find分頁示例詳解
前言
在現(xiàn)實(shí)項(xiàng)目中,數(shù)據(jù)量一般都不小,如果一次性全部請(qǐng)求出來,肯定是影響性能,而且大量數(shù)據(jù)展示到頁面上觀感也不好。這時(shí)我們就需要用到分頁,給定一個(gè) pageSize,每次請(qǐng)求的數(shù)量就是 pageSize 的大小,這樣既可以節(jié)約時(shí)間,又可以美化頁面。Spring JPA 就為我們提供這樣一個(gè)方法,準(zhǔn)確來說是提供了一個(gè)對(duì)象用來約束數(shù)據(jù)按照分頁的形式進(jìn)行請(qǐng)求。
源碼
findAll(Pageable pageable):從入?yún)?pageable 我們可以猜到,就是這個(gè)對(duì)象來幫助我們對(duì)數(shù)據(jù)進(jìn)行分頁查詢。那我們?nèi)绾蝿?chuàng)建 pageable 對(duì)象呢?如何用他去實(shí)現(xiàn)分頁呢?先看一下源碼:
/** * Creates a new {@link Pageable} for the first page (page number {@code 0}) given {@code pageSize} . * * @param pageSize the size of the page to be returned, must be greater than 0. * @return a new {@link Pageable}. * @since 2.5 */ static Pageable ofSize(int pageSize) { return PageRequest.of(0, pageSize); }
由此可見,pageable 對(duì)象需要 pageRequest.of 去創(chuàng)建,那我們?cè)倏纯?pageRequest.of 的源碼:
/** * Creates a new unsorted {@link PageRequest}. * * @param page zero-based page index, must not be negative. * @param size the size of the page to be returned, must be greater than 0. * @since 2.0 */ public static PageRequest of(int page, int size) { return of(page, size, Sort.unsorted()); } /** * Creates a new {@link PageRequest} with sort parameters applied. * * @param page zero-based page index. * @param size the size of the page to be returned. * @param sort must not be {@literal null}, use {@link Sort#unsorted()} instead. * @since 2.0 */ public static PageRequest of(int page, int size, Sort sort) { return new PageRequest(page, size, sort); } /** * Creates a new {@link PageRequest} with sort direction and properties applied. * * @param page zero-based page index, must not be negative. * @param size the size of the page to be returned, must be greater than 0. * @param direction must not be {@literal null}. * @param properties must not be {@literal null}. * @since 2.0 */ public static PageRequest of(int page, int size, Direction direction, String... properties) { return of(page, size, Sort.by(direction, properties)); }
從源碼可以看出,pageRequest.of 需要傳入 page(第幾頁)和 size(頁面大?。?,另外如果需要排序的話,還需要傳入 sort(這個(gè)對(duì)象前一篇已經(jīng)分析過了)。
一、單純分頁查詢
所謂的單純分頁查詢,就是只分頁,不做其他的動(dòng)作,這樣一來,我們只需要傳入 page 和 pageSize 即可。
control 層
@GetMapping("findAllPage") public Page<User> findAllPage(int page, int pageSize) { Pageable pageable = PageRequest.of(page, pageSize); return userService.findAllPage(pageable); }
執(zhí)行請(qǐng)求findAllPage?page=0&pageSize=5
(第一頁、頁面大小為5),控制臺(tái)打印如下:
Hibernate: select user0\_.id as id1\_0\_, user0\_.age as age2\_0\_, user0\_.name as name3\_0\_ from user user0\_ limit ?
Hibernate: select count(user0\_.id) as col\_0\_0\_ from user user0\_
查詢結(jié)果
{ "content": [{ "id": 20, "name": "aa", "age": 11 }, { "id": 21, "name": "bb", "age": 12 }, { "id": 22, "name": "cc", "age": 11 }, { "id": 23, "name": "dd", "age": 16 }, { "id": 24, "name": "ee", "age": 17 } ], "pageable": { "sort": { "empty": true, "sorted": false, "unsorted": true }, "offset": 0, "pageSize": 5, "pageNumber": 0, "unpaged": false, "paged": true }, "last": false, "totalPages": 2, "totalElements": 6, "number": 0, "size": 5, "sort": { "empty": true, "sorted": false, "unsorted": true }, "numberOfElements": 5, "first": true, "empty": false }
結(jié)論
從上面的結(jié)果輸出和控制臺(tái)輸出來看,它除了做了 limit 分頁查詢外,還做了求出了總數(shù)totalElements,還輸出了總頁數(shù) totalPages。這些參數(shù)在我們實(shí)際項(xiàng)目中有的時(shí)候還是很有用的。
二、排序分頁查詢
所謂的排序分頁,就是將數(shù)據(jù)先按照我們所需的方式進(jìn)行排序,然后再進(jìn)行分頁查詢
control 層
@GetMapping("findAllPageSort") public Page<User> findAllPageSort(int page, int pageSize, String[] sorts, String[] paras) { List<Sort.Order> listOrder = new ArrayList<>(); for(int i=0; i<sorts.length; i++){ listOrder.add(new Sort.Order(sorts[i].toLowerCase().equals("asc") ? Sort.Direction.ASC : Sort.Direction.DESC, paras[i])); } Pageable pageable = PageRequest.of(page, pageSize, Sort.by(listOrder)); return userService.findAllPage(pageable); }
執(zhí)行請(qǐng)求findAllPageSort?page=0&pageSize=5&sorts=asc,desc¶s=age,name
(第一頁,頁面大小為5,先按照age升序,再按照name降序),控制臺(tái)打印如下:
Hibernate: select user0_.id as id1_0_, user0_.age as age2_0_, user0_.name as name3_0_ from user user0_ order by user0_.age asc, user0_.name desc limit ?
Hibernate: select count(user0_.id) as col_0_0_ from user user0_
查詢結(jié)果
{ "content": [{ "id": 26, "name": "gg", "age": 7 }, { "id": 22, "name": "cc", "age": 11 }, { "id": 20, "name": "aa", "age": 11 }, { "id": 21, "name": "bb", "age": 12 }, { "id": 23, "name": "dd", "age": 16 } ], "pageable": { "sort": { "empty": false, "sorted": true, "unsorted": false }, "offset": 0, "pageNumber": 0, "pageSize": 5, "paged": true, "unpaged": false }, "totalElements": 7, "last": false, "totalPages": 2, "number": 0, "size": 5, "sort": { "empty": false, "sorted": true, "unsorted": false }, "numberOfElements": 5, "first": true, "empty": false }
三、方法整理
以下是整理的 pageable 對(duì)象可用的一些比較實(shí)用的方法
方法 | 說明 |
---|---|
boolean unpaged | true:未進(jìn)行分頁,false:進(jìn)行了分頁 |
boolean isPaged | true:進(jìn)行了分頁,false:未進(jìn)行分頁 |
int getPageNumber | 獲取當(dāng)前頁數(shù) |
int getPageSize | 獲取頁面大小 |
long getOffSet | 獲取頁面偏移量,相當(dāng)于sql中的start |
Sort getSort | 獲取當(dāng)前的排序規(guī)則 |
Pageable next | 獲取下一頁的分頁信息(翻頁中的下一頁) |
boolean hasPrevious | 是否有上一頁 |
Pageable previous | 獲取上一頁的分頁信息(翻頁鐘的上一頁) |
Pageable first | 獲取首頁分頁信息 |
Pageable previousOrFirst | 如果沒有上一頁則回到首頁 |
總結(jié):
分頁查詢是實(shí)際項(xiàng)目中非常常見的需求,總體上看也沒有什么比較難的地方,需要注意的就是排序了。到目前為止學(xué)習(xí)的都是JpaRepository
自帶的一些接口,下面我們就開始接觸非自帶的需要我們自己去構(gòu)造的方法了。
以上就是Spring JPA find分頁示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring JPA find分頁的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!
相關(guān)文章
Java8生成時(shí)間方式及格式化時(shí)間的方法實(shí)例
這篇文章主要給大家介紹了關(guān)于Java8生成時(shí)間方式及格式化時(shí)間的相關(guān)資料,文中通過示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2020-08-08使用JPA雙向多對(duì)多關(guān)聯(lián)關(guān)系@ManyToMany
這篇文章主要介紹了使用JPA雙向多對(duì)多關(guān)聯(lián)關(guān)系@ManyToMany,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。如有錯(cuò)誤或未考慮完全的地方,望不吝賜教2022-06-0630w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析
這篇文章主要為大家介紹了30w+數(shù)據(jù)使用RedisTemplate?pipeline空指針NullPointerException異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-08-08Java編程中隨機(jī)數(shù)的生成方式總結(jié)
在Java中利用自帶的類庫可以有三種途徑可以產(chǎn)生隨機(jī)數(shù),這里我們舉了一些簡單的例子來進(jìn)行Java編程中隨機(jī)數(shù)的生成方式總結(jié),需要的朋友可以參考下2016-05-05Java并發(fā)之synchronized實(shí)現(xiàn)原理深入理解
這篇文章主要介紹了Java中synchronized實(shí)現(xiàn)原理詳解,涉及synchronized實(shí)現(xiàn)同步的基礎(chǔ),Java對(duì)象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關(guān)內(nèi)容,具有一定借鑒價(jià)值,需要的朋友可以參考下2021-08-08