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://xiahunao.cn/news/3015510.html

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

相关文章

低代码系统能够解决哪些痛点?

不同的应用场景下&#xff0c;低代码系统解决的痛点是不一样的。工业应用场景中的组态软件应该说是最早的低代码系统了。以 Topstack 为代表的Web 组态软件&#xff0c;其核心功能设备数据采集、图形监控画面、数据报表、数据看板、业务逻辑开发等&#xff0c;都是无代码或低代…

观测云 VS ELK:谁是日志监控的王者?

前言 作为 IT 信息系统运行状态感知和故障分析的重要手段&#xff0c;日志在行业兴起之初便为运维和开发环节所广泛应用。当应用和系统发生故障或出现问题时&#xff0c;日志数据成为了排查和诊断问题的重要依据。通过分析日志&#xff0c;开发人员和运维人员可以了解系统的运…

Golang 开发实战day12 - Pointer

&#x1f3c6;个人专栏 &#x1f93a; leetcode &#x1f9d7; Leetcode Prime &#x1f3c7; Golang20天教程 &#x1f6b4;‍♂️ Java问题收集园地 &#x1f334; 成长感悟 欢迎大家观看&#xff0c;不执着于追求顶峰&#xff0c;只享受探索过程 Golang 开发实战day12 - 指针…

二十、Java内存泄漏概念、造成原因及检测方式(全)

文章目录 一、Java内存泄漏概念、造成原因及检测方式&#xff08;全&#xff09;二、其他1.jmap命令2.java VisualVM查看.hprof文件 一、Java内存泄漏概念、造成原因及检测方式&#xff08;全&#xff09; Java内存泄漏概念、造成原因及检测方式&#xff08;全&#xff09; 二…

去哪儿前端一面

谈谈你对mvvm的理解 MVVM分为三个部分:分别是M(Model,模型层 ),V(View,视图层),VM(ViewModel,V与M连接的桥梁,也可以看作为控制器) 1、 M:模型层,主要负责业务数据相关; 2、 V:视图层,顾名思义,负视图相关,细分下来就是html+css层; 3、 VM:V与M沟通的…

Rust 解决循环引用

导航 循环引用一、现象二、解决 循环引用 循环引用出现的一个场景就是你指向我&#xff0c;我指向你&#xff0c;导致程序崩溃 解决方式可以通过弱指针&#xff0c;而Rust中的弱指针就是Weak 在Rc中&#xff0c;可以实现&#xff0c;对一个变量&#xff0c;持有多个不可变引…

极致视觉盛宴,尽在Extreme Picture Finder!

在信息爆炸的时代&#xff0c;网络图片如同繁星点点&#xff0c;为我们的生活增添无尽的色彩。然而&#xff0c;如何在浩渺的网海中快速、准确地找到心仪的图片&#xff0c;却成了许多人的难题。此刻&#xff0c;Extreme Picture Finder如同一位贴心的向导&#xff0c;引领我们…

[一本Java+一本Java]5月7日简历指导直播

一、直播预告 每周二、四、六16:30简历指导直播&#xff0c;前美团项目负责人、校招VIP CEO-大拿老师在线讲简历优化 二、简历内容 三、简历核心问题 【简历1】一本- Java 1 虽然项目名称有一定的包装&#xff0c;两个项目的内容都是一眼能看出来的烂大街的项目&#xff0c…

AIP美国物理联合会文献在家如何查看下载

AIP&#xff08;美国物理联合会&#xff0c;American Institute of Physics&#xff09;成立于1931年&#xff0c;其主要任务是物理知识和应用的推广普及&#xff0c;也是世界上居于领导地位的物理期刊出版社之一。主要的研究方向为物理学和天文物理学。 今天有位同学求助一篇…

呆滞物料规范管理了,问题就好办了

对于制造企业来说&#xff0c;库存是生存和发展的重要保障&#xff0c;过高的库存会占用企业大量的资金和管理成本&#xff0c;影响企业的正常生产&#xff0c;然而多数中小制造企业还在用人工干预管理&#xff0c;如何控制呆滞物料成为仓储管理的一大难题。 什么是呆滞料 呆滞…

#LLM入门 | langchain | RAG # 4.3_文档分割

上一章讨论了文档标准化加载&#xff0c;现在转向文档的细分&#xff0c;这虽简单却对后续工作有重大影响。 一、为什么要进行文档分割 模型大小和内存限制&#xff1a;大型GPT模型参数众多&#xff0c;需大量计算和内存&#xff0c;而硬件设备如GPU或TPU有内存限制&#xff…

Linux下GraspNet复现流程

Linux&#xff0c;Ubuntu中GraspNet复现流程 文章目录 Linux&#xff0c;Ubuntu中GraspNet复现流程1.安装cuda和cudnn2.安装pytorch3.编译graspnetAPIReference &#x1f680;非常重要的环境配置&#x1f680; ubuntu 20.04cuda 11.0.1cudnn v8.9.7python 3.8.19pytorch 1.7.0…

花园牛奶:从靠谱奶牛到新鲜牛奶的匠心之旅

在花园乳业有限公司&#xff0c;我们深知生产出优质牛奶的秘诀——从靠谱的奶牛开始。为此&#xff0c;我们特意引进了品质卓越的荷斯坦奶牛&#xff0c;它们以“黑白花”的优雅身姿&#xff0c;成为了我们牧场上的明星。荷斯坦奶牛以其出色的生产性能和高产奶量而著称&#xf…

CoPilot 产品体验:提升 OpenNJet 的控制管理和服务提供能力

文章目录 前言系统架构介绍CoPilot 配置CoPilot 插件规范 体验 CoPilot 实例CoPilot: Broker 实例CoPilot: Ctrl 实例 开发其他语言编写的 CoPilot目标主要思路具体实现执行 go 程序代码 功能扩展总结 前言 CoPilot 是 OpenNJet 的一个重要组成部分&#xff0c;它在 Master-Wo…

机器学习之基于Python多种混合模型的糖尿病预测

欢迎大家点赞、收藏、关注、评论啦 &#xff0c;由于篇幅有限&#xff0c;只展示了部分核心代码。 文章目录 一项目简介 二、功能三、系统四. 总结 一项目简介 一、项目背景 糖尿病是一种慢性代谢性疾病&#xff0c;其发病率在全球范围内逐年上升&#xff0c;已成为影响人类健…

xmind的13个快捷方式

1.新建导图 CtrlshiftN 2.编辑文字 空格键 3.插入图片 Ctrli 4. 插入主题 Enter键 5. 插入主题之前 ShiftEnter键 6. 插入子主题 Tab键 7. 放大导图 “Ctrl”“” 8. 缩小导图 “Ctrl”“-” 9. 复制 CtrlInsert 10. 粘贴 Shift Insert 11. 剪切 ShiftDelete 12. 截图 F7 13. 保…

【论文阅读笔记】MAS-SAM: Segment Any Marine Animal with Aggregated Features

1.论文介绍 MAS-SAM: Segment Any Marine Animal with Aggregated Features MAS-SAM&#xff1a;利用聚合特征分割任何海洋动物 Paper Code(空的) 2.摘要 最近&#xff0c;分割任何模型&#xff08;SAM&#xff09;在生成高质量的对象掩模和实现零拍摄图像分割方面表现出卓越…

9.4.k8s的控制器资源(job控制器,cronjob控制器)

目录 一、job控制器 二、cronjob控制器 一、job控制器 job控制器就是一次性任务的pod控制器&#xff0c;pod完成作业后不会重启&#xff0c;其重启策略是&#xff1a;Never&#xff1b; 简单案例 启动一个pod&#xff0c;执行完成一个事件&#xff0c;然后pod关闭&#xff1b;…

基于Flask的岗位就业可视化系统(一)

&#x1f31f;欢迎来到 我的博客 —— 探索技术的无限可能&#xff01; &#x1f31f;博客的简介&#xff08;文章目录&#xff09; 前言 本项目综合了基本数据分析的流程&#xff0c;包括数据采集&#xff08;爬虫&#xff09;、数据清洗、数据存储、数据前后端可视化等 推荐…

(40)4.30数据结构(队列)

1.队列的基本概念 2.队列的顺序 #define MaxSize 10 #define ElemType int typedef struct { ElemType data[MaxSize]; int front, rear; }SqQueue;//1.初始化操作 void InitQueue(SqQueue& Q) { //初始化 队头&#xff0c;队尾指针指向0 Q.rear Q.fron…