最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Spring?JPA?find分頁(yè)示例詳解

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

前言

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

源碼

findAll(Pageable pageable):從入?yún)?pageable 我們可以猜到,就是這個(gè)對(duì)象來(lái)幫助我們對(duì)數(shù)據(jù)進(jìn)行分頁(yè)查詢(xún)。那我們?nèi)绾蝿?chuàng)建 pageable 對(duì)象呢?如何用他去實(shí)現(xiàn)分頁(yè)呢?先看一下源碼:

/**
 * 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);
}

由此可見(jiàn),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(第幾頁(yè))和 size(頁(yè)面大?。硗馊绻枰判虻脑?,還需要傳入 sort(這個(gè)對(duì)象前一篇已經(jīng)分析過(guò)了)。

一、單純分頁(yè)查詢(xún)

所謂的單純分頁(yè)查詢(xún),就是只分頁(yè),不做其他的動(dòng)作,這樣一來(lái),我們只需要傳入 pagepageSize 即可。
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(第一頁(yè)、頁(yè)面大小為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\_

查詢(xún)結(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)輸出來(lái)看,它除了做了 limit 分頁(yè)查詢(xún)外,還做了求出了總數(shù)totalElements,還輸出了總頁(yè)數(shù) totalPages。這些參數(shù)在我們實(shí)際項(xiàng)目中有的時(shí)候還是很有用的。

二、排序分頁(yè)查詢(xún)

所謂的排序分頁(yè),就是將數(shù)據(jù)先按照我們所需的方式進(jìn)行排序,然后再進(jìn)行分頁(yè)查詢(xú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&paras=age,name(第一頁(yè),頁(yè)面大小為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_

查詢(xún)結(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í)用的方法

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

總結(jié):

分頁(yè)查詢(xún)是實(shí)際項(xiàng)目中非常常見(jiàn)的需求,總體上看也沒(méi)有什么比較難的地方,需要注意的就是排序了。到目前為止學(xué)習(xí)的都是JpaRepository自帶的一些接口,下面我們就開(kāi)始接觸非自帶的需要我們自己去構(gòu)造的方法了。

以上就是Spring JPA find分頁(yè)示例詳解的詳細(xì)內(nèi)容,更多關(guān)于Spring JPA find分頁(yè)的資料請(qǐng)關(guān)注腳本之家其它相關(guān)文章!

相關(guān)文章

  • 詳解前后端分離之Java后端

    詳解前后端分離之Java后端

    這篇文章主要介紹了詳解前后端分離之Java后端,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-05-05
  • Java使用Callable接口實(shí)現(xiàn)多線程的實(shí)例代碼

    Java使用Callable接口實(shí)現(xiàn)多線程的實(shí)例代碼

    這篇文章主要介紹了Java使用Callable接口實(shí)現(xiàn)多線程的實(shí)例代碼,實(shí)現(xiàn)Callable和實(shí)現(xiàn)Runnable類(lèi)似,但是功能更強(qiáng)大,具體表現(xiàn)在可以在任務(wù)結(jié)束后提供一個(gè)返回值,Runnable不行,call方法可以拋出異,Runnable的run方法不行,需要的朋友可以參考下
    2023-08-08
  • 使用Java實(shí)現(xiàn)qq郵箱發(fā)送郵件

    使用Java實(shí)現(xiàn)qq郵箱發(fā)送郵件

    這篇文章主要為大家詳細(xì)介紹了使用Java實(shí)現(xiàn)qq郵箱發(fā)送郵件,文中示例代碼介紹的非常詳細(xì),具有一定的參考價(jià)值,感興趣的小伙伴們可以參考一下
    2010-05-05
  • Java 確保某個(gè)Bean類(lèi)被最后執(zhí)行的幾種實(shí)現(xiàn)方式

    Java 確保某個(gè)Bean類(lèi)被最后執(zhí)行的幾種實(shí)現(xiàn)方式

    這篇文章主要介紹了Java 確保某個(gè)BeanDefinitionRegistryPostProcessor Bean被最后執(zhí)行的幾種實(shí)現(xiàn)方式,幫助大家更好的理解和學(xué)習(xí)使用Java,感興趣的朋友可以了解下
    2021-03-03
  • SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證

    SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證

    在springboot的登陸頁(yè)面中為了防止機(jī)器大規(guī)模注冊(cè),機(jī)器暴力破解數(shù)據(jù)密碼等危害,需要驗(yàn)證隨機(jī)生成的驗(yàn)證碼,本文主要介紹了SpringBoot使用hutool-captcha實(shí)現(xiàn)驗(yàn)證碼生成與驗(yàn)證,感興趣的可以了解一下
    2023-12-12
  • 如何簡(jiǎn)單的理解依賴(lài)注入詳解

    如何簡(jiǎn)單的理解依賴(lài)注入詳解

    一直對(duì)依賴(lài)注入理解不清楚,最近突然理解了,所以下面這篇文章主要給大家介紹了關(guān)于如何簡(jiǎn)單的理解依賴(lài)注入的相關(guān)資料,文中通過(guò)示例代碼介紹的非常詳細(xì),需要的朋友可以參考下
    2018-07-07
  • 詳解用java描述矩陣求逆的算法

    詳解用java描述矩陣求逆的算法

    這篇文章主要介紹了用java描述矩陣求逆的算法,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧
    2019-03-03
  • 詳解eclipse中Maven工程使用Tomcat7以上插件的方法

    詳解eclipse中Maven工程使用Tomcat7以上插件的方法

    本篇文章主要介紹了詳解eclipse中Maven工程使用Tomcat7以上插件的方法,小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧
    2017-12-12
  • java使用des加密解密示例分享

    java使用des加密解密示例分享

    java使用des加密解密示例,適合java語(yǔ)言的所有平臺(tái),與.net等平臺(tái)的加密解密兼容
    2014-02-02
  • springmvc無(wú)法訪問(wèn)/WEB-INF/views下的jsp的解決方法

    springmvc無(wú)法訪問(wèn)/WEB-INF/views下的jsp的解決方法

    本篇文章主要介紹了springmvc無(wú)法訪問(wèn)/WEB-INF/views下的jsp的解決方法,非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2017-10-10

最新評(píng)論

墨竹工卡县| 东源县| 江山市| 林周县| 疏附县| 安康市| 招远市| 滦南县| 桐乡市| 汾阳市| 祁东县| 石河子市| 武乡县| 华安县| 遂昌县| 苍梧县| 惠东县| 台北市| 板桥市| 革吉县| 安塞县| 江北区| 博客| 石泉县| 常德市| 通道| 姜堰市| 阳高县| 乌兰察布市| 南安市| 南宁市| 临澧县| 石家庄市| 怀远县| 梁平县| 烟台市| 通河县| 大连市| 北流市| 隆化县| 彭泽县|