Spring Data JPA 中的分页和排序

news2024/9/30 3:26:42

让我们学习如何使用 在 Spring 数据 JPA 中使用分页和排序有效地处理大量记录。

什么是分页和排序?

大多数情况下,来自数据库的结果集可能会让人不知所措。它可能会让人不知所措,以至于系统崩溃,因为它们无法在一次传递中处理那么多数据。因此,将这些大记录分解为可管理的块总是一个好主意。这正是分页的意义所在。

分页是将大内容拆分为称为“页面”的较小编号块以使整个数据更易于处理的过程。排序不需要任何介绍或定义。这是一种订购一组类似项目的方法。在我们的例子中,我们将坚持从数据库中对记录进行排序。

您可能已经看到了分页和排序。以谷歌为例。查询的结果为每页 10 个链接。结果根据搜索查询的相关性进行排序(顶部的相关性更高)。

谷歌搜索作为分页和排序的例子

为什么使用分页和排序?

想象一下,如果谷歌没有在结果页上使用分页或排序。平均谷歌搜索会产生数百万次点击。因此,明显的问题是页面需要很长时间才能加载。由于我们不对结果进行排序,因此用户不会找到相关结果。即使他们想通过滚动浏览来查找相关结果,他们也会滚动很多,因为所有结果都在一个页面中。

根据我们的学习,我们应该使用分页和排序技术,原因如下。

  1. 服务器和客户端都更容易处理小结果。
  2. 较大的结果需要更多的资源(CPU、内存、网络等)
  3. 排序结果为系统带来秩序
  4. 排序可以确定项目的优先级

Spring Data JPA 中的分页和排序

Spring Data JPA通过PagingAndSortingRepository提供分页和排序。此存储库接受可分页请求,并在从零开始的索引系统中提供页面。下面是一些重要的类和接口,供您在实现分页和排序之前记住。

  1. 可分页 – 定义特定页面请求的接口。
  2. PageRequest –Pageable 的实现。包含要请求的页面、每页的记录数、排序顺序等。
  3. 页面 – 包含大量结果和有关结果的元信息的页面,例如上一页、下一页、大小、总大小等

要编写可分页查询,您只需将可分页接口作为参数添加到任何 JpaRepository 方法中。

 

@Repository public interface AccountRepository extends JpaRepository<Account, Integer> { @Query("select a from Account a") Page<Account> findAllAccounts(Pageable pageable); }

Code language: Java (java)

若要使用此存储库方法获取结果,需要将可分页对象作为参数传递。以下是如何做到这一点的一些示例。

可分页,包含页码和大小。

 

Pageable pageable = PageRequest.of(2, 40); Page<Account> thirdPage = accountRepository.findAllAccounts(pageable); System.out.println(thirdPage.getContent());

Code language: Java (java)

基于 JPA 实体字段进行排序的页面请求。

 

Pageable pageableWithSort = PageRequest.of(0, 15, Sort.by("balance")); Page<Account> first15AccountsWithLowBalance = accountRepository.findAllAccounts(pageableWithSort); System.out.println(first15AccountsWithLowBalance.getContent());

Code language: Java (java)

对 Spring 数据 JPA 实体字段进行排序和排序方向的分页。

 

Pageable pageableWithSortDirection = PageRequest.of(0, 15, Sort.by("balance").descending()); Page<Account> largest15AccountsByBalance = accountRepository.findAllAccounts(pageableWithSortDirection); System.out.println(largest15AccountsByBalance);

Code language: Java (java)

此外,您还可以访问当前页面的元数据。

 

System.out.println("Total results : " + thirdPage.getTotalElements()); System.out.println("Total Pages : " + thirdPage.getTotalPages()); System.out.println("Current Page number : " + thirdPage.getNumber()); System.out.println("Size per page : " + thirdPage.getSize()); System.out.println("Elements in this page : " + thirdPage.getNumberOfElements());

Code language: Java (java)

在春季 JPA 中循环遍历分页

到目前为止,我们已经看到了如何从大量结果中获取特定页面。但是,如果要遍历所有这些结果,则需要多次查询存储库。但幸运的是,春季数据 jpa 有遍历页面的规定。

 

Pageable pageRequest = PageRequest.of(0, 20); Page<Account> accountsPage; do { accountsPage = accountRepository.findAllAccounts(pageRequest); System.out.println(accountsPage.getContent()); pageRequest = pageRequest.next(); } while (!accountsPage.isLast());

Code language: Java (java)

这里的代码是不言自明的。但是,如果您需要详细信息,只需注意方法即可。这些方法分别有助于进步和打破循环。这样,如果您有大量记录,则可以一次处理 20 条记录。

上一页和下一页

只需在当前页码中添加或减去“1”,即可创建新的可分页对象。但是,借助以下方法,可以更轻松地浏览上一页和下一页。

 

Pageable previousPageable = page.previousPageable(); Pageable previousOrFirstPageable = page.previousOrFirstPageable(); Pageable nextPageable = page.nextPageable(); Pageable nextOrLastPageable = page.nextOrLastPageable(); // or Pageable previousOrFirst = pageable.previousOrFirst(); Pageable next = pageable.next();

Code language: Java (java)

如您所见,有些方法甚至可以处理这里的边缘情况。

在分页查询方法中一次获取所有结果

如果要一次性获取所有记录,可以将页面大小设置为更大的数字。但不能保证结果小于您给定的大小。这就是为什么Spring Data JPA通过“Pageable.unpaged()”方法提供非分页实现的原因。

该方法返回未分页实现的单一实例对象。此类故意重写 Pageable 的 isPaged() 方法以返回 false,完全绕过分页逻辑。

因此,您所要做的就是通过以下方式调用存储库方法。

 

Pageable unpaged = Pageable.unpaged(); Page<Account> allAccounts = accountRepository.findAllAccounts(unpaged); System.out.println("All Results in a Single page" + allAccounts.getContent());

Code language: Java (java)

尽管这违背了分页的全部目的,但您应该知道这种方法是可能的。

总结

总而言之,我们以 Spring boot 应用程序为例,学习了如何在 Spring JPA 中正确使用分页和排序。您可以在此GitHub 存储库中找到上述所有示例。

相关

  • 春季数据JPA简介
  • 带有 Spring 引导的 RESTful JPA 存储库
  • Spring 引导|中的白标错误页面完整指南
  • 春季数据 JPA @ManyToOne注释
  • 在 Spring 引导中更改默认端口号

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/55219.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

2019-10《信息资源管理 02378》真卷(独家文字版),圈定章节考点+统计真题分布

本系列博客合计 21 篇&#xff0c;每篇都将解析一张《信息资源管理》真卷&#xff0c;并附带答案解析与背诵技巧。 搜索 梦想橡皮擦&#xff0c;擦姐整理 全国 2019 年 10 月自学考试信息资源管理试题&#xff08;02378&#xff09; 单选题 1,信息技术是应用信息科学的原理和…

Linux基本工具——yum

Linux基本工具软件包管理器yum什么是软件包Linux的软件包yum的三板斧yum的扩展软件包管理器yum 工具的本质就是指令 什么是软件包 我们平时用手机与电脑的时候&#xff0c;如果想安装一个软件就需要去下载它的安装包&#xff08;软件包&#xff09;&#xff0c;下载安装包的…

前端怎么才能找到项目做?

前言 一般找项目最常用的就是在Github上&#xff0c;题主已经具备了html、css、js和vue的知识体系&#xff0c;那么在github或者找一些项目教程视频来实践是锻炼的最好途径&#xff0c;下面我整理了一些在github和B站上找了一些前端的经典项目&#xff0c;希望对你有所帮助~ …

Kotlin 开发Android app(十六):ContentProvider的使用

android的四大组件&#xff0c;已经介绍了两个&#xff0c;这一节介绍ContentProvider。前面的广播可以进行 app内的通讯&#xff0c;如果需要进行app之间的通讯&#xff0c;在android 中使用的是ContentProvider。ContentProvider 也分为三种&#xff0c;一&#xff0c;作为数…

物通博联持续参与京东方(BOE)工厂数字化项目

创新引领 数字驱动 京东方科技集团股份有限公司&#xff08;BOE&#xff09;创立于1993年&#xff0c;是全球领先的半导体显示技术、产品与服务提供商&#xff0c;核心业务包括显示器件、智慧系统和健康服务。产品广泛应用于手机、平板电脑、笔记本电脑、显示器、电视、车载、…

php万年历源代码!源代码![上一年、上一月、下一月、下一年、附加当天日期加背景颜色]-私聊源码

//当前年 $year isset($_GET[year])?$_GET[year]:date(Y); //echo $year; //制作当前月的变量 $monthisset($_GET[month])?$_GET[month]:date(n); //本月有多少天 $day date(t,mktime(0,0,0,$month,1,$year)); //本月从1号开始是星期几 $w date(w,mktime(0,0,0,$month,1…

python处理csv文件

如何使用python处理csv文件 素材准备 ​ csv⽂件其实就是⽂本⽂件&#xff0c;遵循了⼀定的格式&#xff0c;常⻅的csv⽂件⼀般是⽤逗号来隔开列&#xff0c;⽤换⾏符隔开不同的⾏&#xff0c;注意这⾥的符号都是英⽂符号。我们可以直接⽤open函数来打开csv⽂件&#xff1b; …

.net----数据库的访问ADO.NET、DataAdapter和DataSet

数据库的访问前言ADO.NET的概述ADO.NET数据源访问处理数据类库的两个组件&#xff1a;引用System.Data.dll和System.Xml.dll使用ADO.NET连接和操作数据库使用数据提供程序访问数据库操作的典型步骤&#xff1a;&#xff08;1&#xff09;建立数据库连接&#xff08;2&#xff0…

艾美捷曲妥珠单抗Trastuzumab参数和相关研究

曲妥珠单抗是一种重组人源化单克隆抗体&#xff0c;特异性地作用于人表皮生长因子受体-2(HER2)的细胞外部位。此抗体含人IgG1 框架&#xff0c;互补决定区源自鼠抗p185 HER2 抗体&#xff0c;能够与HER2 绑定。 HER2 原癌基因或C-erbB2 编码一个单一的受体样跨膜蛋白&#xff0…

Tyramide Cy5.5,Cyanine5.5 Tyramide,花青素Cy5.5酪酰胺远红色近红外发射染料

​一、理论分析&#xff1a; 中文名&#xff1a;花青素Cy5.5 酪酰胺 英文名&#xff1a;Cyanine5.5 Tyramide&#xff0c;Cy5.5 Tyramide&#xff0c;Tyramide Cy5.5 CAS号&#xff1a;N/A 化学式&#xff1a;C48H52CIN3O2 分子量&#xff1a;738.4 二、产品详情&#xff1a; 外…

【D3.js】1.20-给 D3 元素添加工具提示

title: 【D3.js】1.20-给 D3 元素添加工具提示 date: 2022-12-02 15:04 tags: [JavaScript,CSS,HTML,D3.js,SVG] 继续增强交互性&#xff1a;给元素添加悬停提示。 一、学习目标 如何给元素添加悬停提示&#xff1f; 通过title元素&#xff1a;增加title元素&#xff0c;通过.…

HTML+CSS+JS网页设计期末课程大作业——海贼王(8个页面)动漫网页设计

HTML实例网页代码, 本实例适合于初学HTML的同学。该实例里面有设置了css的样式设置&#xff0c;有div的样式格局&#xff0c;这个实例比较全面&#xff0c;有助于同学的学习,本文将介绍如何通过从头开始设计个人网站并将其转换为代码的过程来实践设计。 精彩专栏推荐&#x1f4…

vector类的常用接口说明

目录 一、(constructor)构造函数声明 二、vector的迭代器 三、vector的增删改查 四、insert和erase&#xff0c;以及查找find&#xff08;find不属于vector&#xff0c;是stl提供的算法&#xff09; 五、三种遍历方式 六、源代码 vector是可变大小数组的序列容器 一、(c…

海豚调度器分布式部署

前置准备 服务器 node01,node02,node03三台服务器&#xff08;本教程服务器系统版本Linux version 3.10.0-1160.el7.x86_64&#xff09; node01作为master&#xff0c;api&#xff0c;alert节点&#xff0c;node02和node03作为worker节点 安装包下载 下载dolphinscheduler和…

RFID数据采集成为MES系统精准数据

随着信息化、自动化成为企业发展趋势&#xff0c;制造执行系统(MES)是连接计划层和现场控制层之间的纽带&#xff0c;成为企业制造战略重要技术手段。MES生产执行系统主要在生产过程层及管理层之间加强数据集成与分析的力度&#xff0c;拓展优化技术应用的范围&#xff0c;真正…

猿创征文|Python学习工具千千万,我心中的TOP10

前言&#xff1a; 大家好&#xff0c;我是是Dream呀&#xff0c;在我们平时的开发和生活中&#xff0c;每天都在使用、寻找、贡献、创作各类开发者工具&#xff0c;包括开源服务、付费软件、API等。好的工具可以极大帮助我们提升效率&#xff0c;服务业务。作为一名资深的Pytho…

MFC下拉框控件用法

目录 一、属性方式设置下拉框内容 1.Combo Box下拉框 2.Data属性 3.Type属性 4.Sort属性 二、初始化OnInitDialog设置下拉框内容 1.添加Combo Box下拉框变量 2.AddString方法添加选项 3.SetCurSel设置默认显示内容 4.InsertString方法插入内容 4.DeleteString删除指…

数据中心网络设计- 叶脊(Spine-Leaf)网络架构

大家好&#xff0c;我是技福的小咖老师。 随着业务形态的变化&#xff0c;数据中心网络的交换架构也在不断的发展。传统的三层网络结构应用广泛而且技术成熟&#xff0c;但随着技术的发展趋势&#xff0c;它的瓶颈也不断涌现&#xff0c;导致越来越多的网络工程师放弃这种结构…

[附源码]计算机毕业设计JAVA校园一卡通管理信息系统台

[附源码]计算机毕业设计JAVA校园一卡通管理信息系统台 项目运行 环境配置&#xff1a; Jdk1.8 Tomcat7.0 Mysql HBuilderX&#xff08;Webstorm也行&#xff09; Eclispe&#xff08;IntelliJ IDEA,Eclispe,MyEclispe,Sts都支持&#xff09;。 项目技术&#xff1a; SSM…

C#上位机系列(5)—示波器二基础代码+线条绘制

本文是讲解C#.net平台的Winform框架下的第四个内容&#xff0c;手把手介绍上位机项目的创建方式以及一些写软件时常用的功能&#xff0c;讲解从零开始的每一个步骤。 接上一节的介绍&#xff0c;本次内容为上位机项目中示波功能代码的基本函数和画图功能。 目的是通过几行代码…