欧美bbbwbbbw肥妇,免费乱码人妻系列日韩,一级黄片

Spring?JPA?find分頁示例詳解

 更新時間:2023年04月26日 14:49:57   作者:煙雨戲江南  
這篇文章主要為大家介紹了Spring?JPA?find分頁示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪

前言

在現(xiàn)實項目中,數(shù)據量一般都不小,如果一次性全部請求出來,肯定是影響性能,而且大量數(shù)據展示到頁面上觀感也不好。這時我們就需要用到分頁,給定一個 pageSize,每次請求的數(shù)量就是 pageSize 的大小,這樣既可以節(jié)約時間,又可以美化頁面。Spring JPA 就為我們提供這樣一個方法,準確來說是提供了一個對象用來約束數(shù)據按照分頁的形式進行請求。

源碼

findAll(Pageable pageable):從入參 pageable 我們可以猜到,就是這個對象來幫助我們對數(shù)據進行分頁查詢。那我們如何創(chuàng)建 pageable 對象呢?如何用他去實現(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 對象需要 pageRequest.of 去創(chuàng)建,那我們再看看 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(這個對象前一篇已經分析過了)。

一、單純分頁查詢

所謂的單純分頁查詢,就是只分頁,不做其他的動作,這樣一來,我們只需要傳入 pagepageSize 即可。
control 層

@GetMapping("findAllPage")
public Page<User> findAllPage(int page, int pageSize) {
    Pageable pageable = PageRequest.of(page, pageSize);
    return userService.findAllPage(pageable);
}

執(zhí)行請求findAllPage?page=0&pageSize=5(第一頁、頁面大小為5),控制臺打印如下:

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\_

查詢結果

{
    "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
}

結論

從上面的結果輸出和控制臺輸出來看,它除了做了 limit 分頁查詢外,還做了求出了總數(shù)totalElements,還輸出了總頁數(shù) totalPages。這些參數(shù)在我們實際項目中有的時候還是很有用的。

二、排序分頁查詢

所謂的排序分頁,就是將數(shù)據先按照我們所需的方式進行排序,然后再進行分頁查詢
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í)行請求findAllPageSort?page=0&pageSize=5&sorts=asc,desc&paras=age,name(第一頁,頁面大小為5,先按照age升序,再按照name降序),控制臺打印如下:

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_

查詢結果

{
	"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 對象可用的一些比較實用的方法

方法說明
boolean unpagedtrue:未進行分頁,false:進行了分頁
boolean isPagedtrue:進行了分頁,false:未進行分頁
int getPageNumber獲取當前頁數(shù)
int getPageSize獲取頁面大小
long getOffSet獲取頁面偏移量,相當于sql中的start
Sort getSort獲取當前的排序規(guī)則
Pageable next獲取下一頁的分頁信息(翻頁中的下一頁)
boolean hasPrevious是否有上一頁
Pageable previous獲取上一頁的分頁信息(翻頁鐘的上一頁)
Pageable first獲取首頁分頁信息
Pageable previousOrFirst如果沒有上一頁則回到首頁

總結:

分頁查詢是實際項目中非常常見的需求,總體上看也沒有什么比較難的地方,需要注意的就是排序了。到目前為止學習的都是JpaRepository自帶的一些接口,下面我們就開始接觸非自帶的需要我們自己去構造的方法了。

以上就是Spring JPA find分頁示例詳解的詳細內容,更多關于Spring JPA find分頁的資料請關注腳本之家其它相關文章!

相關文章

  • 帶你輕松了解Modbus協(xié)議

    帶你輕松了解Modbus協(xié)議

    這篇文章主要給大家介紹了關于Modbus協(xié)議的相關資料,此協(xié)議定義了一個控制器能認識使用的消息結構,而不管它們是經過何種網絡進行通信的,需要的朋友可以參考下
    2021-11-11
  • Java8生成時間方式及格式化時間的方法實例

    Java8生成時間方式及格式化時間的方法實例

    這篇文章主要給大家介紹了關于Java8生成時間方式及格式化時間的相關資料,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友們下面隨著小編來一起學習學習吧
    2020-08-08
  • SpringMVC中的HandlerAdapter解析

    SpringMVC中的HandlerAdapter解析

    這篇文章主要介紹了SpringMVC中的HandlerAdapter解析,HandlerAdapter是一個關鍵的組件,用于將請求與處理程序方法進行適配和調度,它充當了控制器和處理程序之間的橋梁,負責將請求的參數(shù)和處理程序方法進行匹配,并將結果返回給前端,需要的朋友可以參考下
    2023-10-10
  • 使用JPA雙向多對多關聯(lián)關系@ManyToMany

    使用JPA雙向多對多關聯(lián)關系@ManyToMany

    這篇文章主要介紹了使用JPA雙向多對多關聯(lián)關系@ManyToMany,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教
    2022-06-06
  • Java超詳細講解類變量和類方法

    Java超詳細講解類變量和類方法

    這篇文章主要介紹了JAVA類變量及類方法代碼實例詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2022-05-05
  • 30w+數(shù)據使用RedisTemplate?pipeline空指針NullPointerException異常分析

    30w+數(shù)據使用RedisTemplate?pipeline空指針NullPointerException異常分析

    這篇文章主要為大家介紹了30w+數(shù)據使用RedisTemplate?pipeline空指針NullPointerException異常分析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪
    2023-08-08
  • Java編程中隨機數(shù)的生成方式總結

    Java編程中隨機數(shù)的生成方式總結

    在Java中利用自帶的類庫可以有三種途徑可以產生隨機數(shù),這里我們舉了一些簡單的例子來進行Java編程中隨機數(shù)的生成方式總結,需要的朋友可以參考下
    2016-05-05
  • EJB基礎知識(入門必看)

    EJB基礎知識(入門必看)

    下面小編就為大家?guī)硪黄狤JB基礎知識(入門必看)。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-06-06
  • Java并發(fā)之synchronized實現(xiàn)原理深入理解

    Java并發(fā)之synchronized實現(xiàn)原理深入理解

    這篇文章主要介紹了Java中synchronized實現(xiàn)原理詳解,涉及synchronized實現(xiàn)同步的基礎,Java對象頭,Monitor,Mark Word,鎖優(yōu)化,自旋鎖等相關內容,具有一定借鑒價值,需要的朋友可以參考下
    2021-08-08
  • 配置Servlet兩種方法以及特點詳解

    配置Servlet兩種方法以及特點詳解

    這篇文章主要介紹了配置Servlet兩種方法以及特點詳解,文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下
    2020-03-03

最新評論