java编程中,实现分页对象的类型转换

一、背景

当数据库分页查询返回的对象与接口要返回的对象类型不一致时,不可避免需要进行类型转换。

示例:数据库分页查询返回的对象是PageDTO,而接口返回的对象类型是PageVO。

  • PageDTO
@Data
public class PageDTO<T> {/*** Current page.*/private Integer page;/*** Current size.*/private Integer size;/*** Total.*/private Long total;/*** Page List*/private List<T> list;/*** New page dto.*/public PageDTO() {this.page = 1;this.size = 10;this.total = 0L;this.list = new ArrayList<>();}
}
  • PageVO
import io.swagger.annotations.ApiModelProperty;
import lombok.Data;import java.util.List;@Data
public class PageVO<T> {@ApiModelProperty("Current page.")private Integer page;@ApiModelProperty("Page size.")private Integer size;@ApiModelProperty("Page total.")private Long total;@ApiModelProperty("Data list.")private List<T> list;
}

现在需要进行把PageDTO < AlertRule > 转换为PageVO < ListAlertRuleVO >

二、实现

public static <S, T> PageVO<T> convert(PageDTO<S> pageDTO, Function<S, T> function) {PageVO<T> pageVO = new PageVO<>();pageVO.setSize(pageDTO.getSize());pageVO.setPage(pageDTO.getPage());pageVO.setTotal(pageDTO.getTotal());List<T> list = Lists.newArrayList();if (!CollectionUtils.isEmpty(pageDTO.getList())) {list = pageDTO.getList().stream().map(function).collect(Collectors.toList());}pageVO.setList(list);return pageVO;}

使用示例:

         PageDTO<AlertRule> pageList = this.alertRuleDAO.pageList(request.getName(), request.getPage(), request.getSize());if (CollectionUtils.isEmpty(pageList.getList())) {return PageUtil.emptyList(ListAlertRuleVO.class);}return PageUtil.convert(pageList, r -> {ListAlertRuleVO listAlertRuleVO = new ListAlertRuleVO();listAlertRuleVO.setId(r.getId());listAlertRuleVO.setName(r.getName());// 略return listAlertRuleVO;});
  • pageList()方法实现概要
// Condition
Example<AlertRule> example = Example.of(alertRule, matching);
PageRequest pageRequest = PageRequest.of(page - 1, size, Sort.by(Sort.Direction.DESC, "id"));// Pagination
PageDTO<AlertRule> pageDTO = new PageDTO<>();// Query
Page<AlertRule> pageList = this.alertRuleRepository.findAll(example, pageRequest);
if (!pageList.isEmpty()) {pageDTO.setPage(page);pageDTO.setSize(size);pageDTO.setTotal(pageList.getTotalElements());pageDTO.setList(pageList.toList());
}
return pageDTO;

三、总结

这里封装了一个工具类PageUtil,结合java的泛型,使用函数式编程Function实现了类型的抽象与转换。

在这里插入图片描述

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

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

相关文章

Python专题:一、安装步骤

1、下载地址&#xff1a;Welcome to Python.org 勾选这个add 其他的全部下一步即可。 运行出现这个即代表安装成功。 Python自带编辑器。 2、推荐使用的sublime 编辑器下载 全部下一步安装。

C++ 函数与指针

函数内部数据是地址需要传递给调用函数&#xff0c;返回的当然是指针了&#xff01;当然&#xff0c;这个返回地址也可以通过函数参数返回&#xff01; 函数的参数是指针可以输出函数多个结果&#xff0c;返回值本身就是返回数据&#xff0c;什么时候需要返回指针呢&#xff1f…

Spring从零开始学使用系列(五)--Bean定义继承与容器扩展点

1.引言 Spring框架因其强大的依赖注入和灵活的配置管理而广受欢迎。Bean定义继承和容器扩展点是其提供的两个核心特性&#xff0c;它们为开发者在维护大型应用时提供了极大的便利。本文旨在详细探讨这些特性的工作原理和实际应用&#xff0c;帮助开发者更好地理解和利用这些高级…

学习记录之数学表达式(4)

文章目录 八、min 与 argmin8.1 min8.2 argmin8.3 作业 九、累加、累乘与积分9.1 累加9.2 累乘9.3 定积分9.4 作业 八、min 与 argmin min 和 argmin 在机器学习中常用&#xff1b;max 和argmax 同理&#xff1b; 8.1 min min 是 minimal 的缩写&#xff0c;用于获得集合中的…

5.6代码

1.最大公约数 这个题最重要的是要找到一个区间是1&#xff0c;找到之后就可以直接加次数就可以了 #include <bits/stdc.h>using namespace std;main() {long long n,i,j,a0,b,ans99999;cin>>n;long long s[n],dp[n][n];for(i0;i<n;i){cin>>s[i];if(s[i]1…

sorted_numbers = numbers_int.sort()对不对??不对!!!

不对&#xff0c;numbers_int.sort() 方法会直接修改 numbers_int 列表&#xff0c;并且它不返回任何值&#xff08;在 Python 中&#xff0c;对列表的原地修改方法通常返回 None&#xff09;。因此&#xff0c;将 numbers_int.sort() 的结果赋值给 sorted_numbers 变量会导致 …

238. 除自身以外数组的乘积/41. 缺失的第一个正数

238. 除自身以外数组的乘积 给你一个整数数组 nums&#xff0c;返回 数组 answer &#xff0c;其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法&a…

shell常用文件处理命令

1. 解压 1.1 tar 和 gz 文件 如果你有一个 .tar 文件,你可以使用以下命令来解压: tar -xvf your_file.tar在这个命令中,-x 表示解压缩,-v 表示详细输出(可选),-f 后面跟着要解压的文件名。 如果你的 .tar 文件同时被 gzip 压缩了(即 .tar.gz 文件),你可以使用以下…

黑马程序员HarmonyOS4+NEXT星河版入门到企业级实战教程笔记

HarmonyOS NEXT是纯血鸿蒙&#xff0c;鸿蒙原生应用&#xff0c;彻底摆脱安卓 本课程是基于harmony os4的&#xff0c;与next仅部分api有区别 套件 语言&框架 harmony os design ArkTs 语言 ArkUI 提供各种组件 ArkCompiler 方舟编译器 开发&测试 DevEco Studio 开发…

Vue3工程化配置

Vue3工程化配置 目录 Vue3工程化配置创建项目vue-clivite(推荐) 快速体验2和3的差别vue3vue2 ref和reactive 创建项目 vue-cli 具体环境配置请点这里 记得新建配置时这里选vue3 vite(推荐) 注&#xff1a;Vite 需要 Node.js 版本 18&#xff0c;20 1.选定路径后再cmd输入创建…

免费在线录屏、无需注册、免费可用、无限制

免费在线工具 https://orcc.online/ 在线录屏 https://orcc.online/recorder pdf在线免费转word文档 https://orcc.online/pdf 时间戳转换 https://orcc.online/timestamp Base64 编码解码 https://orcc.online/base64 URL 编码解码 https://orcc.online/url Hash(MD5/SHA…

羊大师解读,当代年轻人焦虑应对指南

羊大师解读&#xff0c;当代年轻人焦虑应对指南 当代年轻人面临焦虑问题时&#xff0c;羊大师提出以下综合建议&#xff0c;要增强自我认知了解自身的需求和期望&#xff0c;明确自己的价值观和目标。这有助于避免盲目跟风和过度比较&#xff0c;从而减轻不必要的焦虑。 合理规…

apk反编译修改教程系列---修改指定apk 让其开机自动打开运行【十四】

通过前面的几期反编译apk的博文 。应该初步了解反编译apk的一些常识和简单的修改步骤。在与有些工作室合作中。一些客户需要安卓机型开机自动打开运行指定的apk。这类需求常规我们都先要检查apk有没有加密 加固。然后对应修改其中的代码。今天以一款apk实例步骤演示修改的过程 …

c++ 线程同步的临界区应用举例

在C中&#xff0c;临界区通常是通过互斥量&#xff08;mutex&#xff09;来实现的&#xff0c;因为互斥量用于保护代码段&#xff08;即临界区&#xff09;&#xff0c;以确保在任意时刻只有一个线程可以执行该代码段。然而&#xff0c;从技术上来说&#xff0c;"临界区&q…

企业怎样进行IT外包以及IT外包服务内容

在数字化时代的浪潮中&#xff0c;企业逐渐认识到信息技术的关键作用&#xff0c;特别是制造业基地对于IT外包和运维服务的需求持续增长。然而&#xff0c;在诸多可供选择的IT外包和运维方案中&#xff0c;企业如何推动与IT外包公司的合作&#xff1f;本文将深入介绍IT外包方案…

液位开关常开常闭怎么区分

如今随着科学技术的不断发展&#xff0c;液位检测技术也不断改进&#xff0c;液位开关是如今常用的液位检测技术之一&#xff0c;那么液位开关常开常闭怎么区分&#xff1f; 常开液位开关是指在没有液体存在的情况下就处于导通状态。当液体液面上升到液位开关处时&#xff0c;…

C++| std::copy与memcpy区别

前言&#xff1a;最近在读项目源码&#xff0c;发现有些地方用std::copy&#xff0c;有些地方用memcpy。但是并不知道为什么要这样&#xff0c;但是原作者也不认识&#xff0c;就只好自己研究一下了。 std::copy与memcpy区别 对比使用场景使用std::copymemcpy 对比 相同&#…

探索大型语言模型在信息提取中的应用与前景

随着人工智能技术的快速发展&#xff0c;大型语言模型&#xff08;LLMs&#xff09;在自然语言处理&#xff08;NLP&#xff09;领域取得了显著的进展。特别是在信息提取&#xff08;IE&#xff09;任务中&#xff0c;LLMs展现出了前所未有的潜力和优势。信息提取是从非结构化文…

跨考专业课142分,上岸重邮!

这个系列会邀请上岸学长学姐进行经验分享~ 今天分享经验的同学是我的“关门弟子”&#xff0c;小叮当&#xff0c;跨考上岸重邮通信工程&#xff01;从平时和小叮当的交流和测试&#xff0c;就能看出专业课水平&#xff0c;我一直和她开玩笑说&#xff0c;早点遇到我&#xff…

网站为什么需要固态硬盘服务器

首先&#xff0c;SSD没有旋转磁盘&#xff0c;所以它读写数据的速度比HDD快。了解通过选择SSD固态硬盘服务器可以获得的其他潜在好处。 1.更快的速度&#xff1a;固态硬盘服务器上的站点加载速度可以比HDD服务器上的站点快三倍 2.更高的可靠性&#xff1a;由于缺少活动部件&am…