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.hqwc.cn/news/686064.html

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

相关文章

同一局域网内互传文件

1. 打开要共享的文件夹&#xff0c;然后在地址框内输入cmd 2. 弹出的命令框内输入python -m http.server &#xff08;这么就创建好了共享服务器&#xff09; 3.win R输入cmd运行 4.输入ipconfig找到IP地址 5.另一台同一局域网内的机子就可以在网页浏览器输入ip和端口号…

五金建材微信小程序商城系统开发搭建指南

如今&#xff0c;随着移动互联网的发展&#xff0c;小程序成为了商家们开拓新市场、增加收益的重要途径。特别是对于五金店这类实体店铺来说&#xff0c;通过小程序开设线上商城&#xff0c;不仅可以提升品牌影响力&#xff0c;还能够实现线上线下的无缝对接&#xff0c;为店家…

SpringBoot 实现 RAS+AES 自动接口解密

接口安全老生常谈了 目前常用的加密方式就对称性加密和非对称性加密&#xff0c;加密解密的操作的肯定是大家知道的&#xff0c;最重要的使用什么加密解密方式&#xff0c;制定什么样的加密策略&#xff1b;考虑到我技术水平和接口的速度&#xff0c;采用的是RAS非对称加密和AE…

FilterListener详解

文章目录 MVC模式和三层架构MVC模式三层架构MVC和三层架构 JavaWeb的三大组件Filter概述快速入门过滤器API介绍过滤器开发步骤配置过滤器俩种方式修改idea的过滤器模板 使用细节生命周期拦截路径过滤器链 案例统一解决全站乱码问题登录权限校验验 ServletContextServletContext…

回溯算法—组合问题

文章目录 介绍应用问题基本流程算法模版例题&#xff08;1&#xff09;组合&#xff08;2&#xff09;电话号码的字母组合 介绍 回溯算法实际上是 一个类似枚举的搜索尝试过程&#xff0c;主要是在搜索尝试过程中寻找问题的解&#xff0c;当发现已不满足求解条件时&#xff0c;…

Spring添加注解读取和存储对象

5大注解 Controller 控制器 Service 服务 Repository 仓库 Componet 组件 Configuration 配置 五大类注解的使用 //他们都是放在同一个目录下&#xff0c;不同的类中 只不过这里粘贴到一起//控制器 Controller public class UserController {public void SayHello(){System.ou…

C++进阶 | [3] 搜索二叉树

摘要&#xff1a;什么是搜索二叉树&#xff0c;实现搜索二叉树&#xff08;及递归版本&#xff09; 什么是搜索二叉树 搜索二叉树/二叉排序树/二叉查找树BST&#xff08;Binary Search Tree&#xff09;&#xff1a;特征——左小右大&#xff08;不允许重复值&#xff09;。即…

pydev debugger: process **** is connecting

目录 解决方案一解决方案二 1、调试时出现pydev debugger: process **** is connecting 解决方案一 File->settings->build,execution,deployment->python debugger 下面的attach to subprocess automatically while debugging取消前面的勾选&#xff08;默认状态为勾…

rbac权限和多级请假设计的流程演示和前端页面实现

登录账号&#xff1a;t6普通用户 t7部门经理 m8总经理 密码都为&#xff1a;test 多级请假&#xff1a;7级及以下申请请假需要部门经理审核&#xff0c;若是请假时长超过72小时&#xff0c;则需要总经理审核&#xff0c;7级申请请将需要总经理审核&#xff0c;总经理请假自动审…

Go 语言基础之常用包【flag、time、strconv、io】

1、命令行参数包 flag flag 包就是一个用来解析命令行参数的工具。 1.1、os.Args import ("fmt""os" )func main() {if len(os.Args) > 0 {for index, arg : range os.Args {fmt.Printf("args[%d]%v\n", index, arg)}} } 运行结果&#…

Relaxed MemoryConsistency

SC和TSO都被称之为强&#xff08;strong&#xff09;保序模型&#xff1b; because the global memory order of each model usually respects (preserves) per-thread program order&#xff1b;回想一下&#xff0c;对于load和store的所有四种组合&#xff08;Load -> Lo…

【系统分析师】软件架构设计

文章目录 1、构件与软件复用1.1 主流构件标准1.2 构件获取与管理1.3 构件复用的方法 2、软件架构概述3、软件架构建模4、软件架构风格4.1 经典架构风格4.2 层次架构风格4.3 富互联网应用-RIA 5、面向服务的架构5.1 SOA概述5.2 SOA的关键技术5.3 SOA的实现方法 6、软件架构评估6…