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实现了类型的抽象与转换。

在这里插入图片描述

  • 1
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值