一、背景
当数据库分页查询返回的对象与接口要返回的对象类型不一致时,不可避免需要进行类型转换。
示例:数据库分页查询返回的对象是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实现了类型的抽象与转换。