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