原理都是取出Page包装的对象,然后实现对象之间的互传,在返回Page,这里介绍几种实现方式
1. 这个mapper是基于mapStruct,常用来实现Model,DTO的互转,
<!-- https://mvnrepository.com/artifact/org.mapstruct/mapstruct-jdk8 -->
<dependency>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-jdk8</artifactId>
<version>1.3.0.Final</version>
</dependency>
引 Jar,pom文件引Jar,还有build插件,Maven 编译等,稍微麻烦些
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.6.1</version>
<configuration>
<source>${java.version}</source>
<target>${java.version}</target>
<annotationProcessorPaths>
<path>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<version>1.16.22</version>
</path>
<path>
<groupId>org.mapstruct</groupId>
<artifactId>mapstruct-processor</artifactId>
<version>1.3.0.Final</version>
</path>
</annotationProcessorPaths>
<compilerArgs>
<arg>-Amapstruct.suppressGeneratorTimestamp=true</arg>
<arg>-Amapstruct.defaultComponentModel=spring</arg>
</compilerArgs>
</configuration>
</plugin>
以下是demo示例
public Page<CustomerDTO> page2(){
PageRequest pageRequest = PageRequest.of(0, 20, Sort.Direction.DESC,"customerNumber");
Page<CustomersEntity> all = customerRepo.findAll(pageRequest);
Page<CustomerDTO> map = all.map(e -> customerMapper.toCustomerDto(e));
return map;
}
2. 基于Json实现对象的互转,这里我用的是Hutool包,(注意这里如果涉及时间类型的字段映射,可能会转换错误)
public Page<CustomerDTO> page3(){
PageRequest pageRequest = PageRequest.of(0, 20, Sort.Direction.DESC,"customerNumber");
Page<CustomersEntity> all = customerRepo.findAll(pageRequest);
Page<CustomerDTO> map = all.map(e -> JSONUtil.toBean(JSONUtil.toJsonStr(e),CustomerDTO.class));
return map;
}
注意,Hutool包的JsonUtil在转换对象的时候,有时候会因为时间类型(LocalDateTime)的字段,转换错误,第一种Mapper方式还没试
3. 使用构造方法实现对象的转换,在V0中定义如下的构造方法即可,注意参数
public MoveRecordVo(MoveInfo moveInfo) {
this.assetId = moveInfo.getAssetId();
this.assetName = moveInfo.getAssetName();
this.startTime = moveInfo.getStartTime();
this.endTime = moveInfo.getEndTime();
this.moveTime = null;
this.moveStatus = moveInfo.getMoveStatus();
this.remarks = moveInfo.getRemarks();
this.isOperate = null;
}
这样在转换对象的时候,就很方便了
Page<MoveInfo> all = moveInfoRepository.findAll(pageRequest);
Page<MoveRecordVo> map = all.map(e -> new MoveRecordVo(e));
4. 还有一种方法,稍微麻烦一点,就是先把Page转成List,再根据之前的分页参数(JPA,根据前端传参,计算好的分页参数Pageable)返回封装Page,代码如下,不想细整理了
public Page<TranscodeRecordVo> findAll(TranscodeDto transcodeDto, int page, int rows, String sord, String sidx) {
if (StrUtil.isBlankIfStr(sidx)) {
sidx = "transcodeId";
}
PageRequest pageRequest = PageRequest.of(page - 1, rows, Sort.by(Sort.Order.asc(sidx), Sort.Order.desc("collectTime")));
Page<Transcode> all = transcodeRepository.findAll((Specification<Transcode>) (root, query, cb) -> {
List<Predicate> predicates = Lists.newArrayList();
predicates.add(cb.equal(root.get("groupId"), transcodeDto.getGroupId()));
if (!StrUtil.isBlankIfStr(transcodeDto.getAssetId())) {
predicates.add(cb.equal(root.get("assetId"), transcodeDto.getAssetId()));
}
if (!StrUtil.isBlankIfStr(transcodeDto.getAssetName())) {
predicates.add(cb.like(root.get("assetName"), "%" + transcodeDto.getAssetName() + "%"));
}
if (!StrUtil.isBlankIfStr(transcodeDto.getTranscodeStatus())) {
predicates.add(cb.equal(root.get("transcodeStatus"), transcodeDto.getTranscodeStatus()));
}
if (!StrUtil.isBlankIfStr(transcodeDto.getFromStartTime())) {
predicates.add(cb.greaterThanOrEqualTo(root.get("endTime"), transcodeDto.getFromStartTime()));
}
if (!StrUtil.isBlankIfStr(transcodeDto.getToEndTime())) {
predicates.add(cb.lessThanOrEqualTo(root.get("endTime"), transcodeDto.getToEndTime()));
}
return cb.and(predicates.toArray(new Predicate[0]));
}, pageRequest);
ArrayList<TranscodeRecordVo> list = Lists.newArrayList();
all.getContent().forEach(e -> {
TranscodeRecordVo vo = new TranscodeRecordVo();
BeanUtil.copyProperties(e, vo);
list.add(vo);
});
list.forEach(e -> {
if (NodeResultEnum.TranscodeStatus.STARTED.getKey().equals(e.getTranscodeStatus())) {
e.setTransTime(DateUtil.formatBetween(ChronoUnit.MILLIS.between(e.getStartTime(), LocalDateTime.now()), BetweenFormater.Level.SECOND));
} else {
e.setTransTime(DateUtil.formatBetween(ChronoUnit.MILLIS.between(e.getStartTime(), e.getEndTime()), BetweenFormater.Level.SECOND));
}
if (NodeResultEnum.TranscodeStatus.FAILED.getKey().equals(e.getTranscodeStatus())) {
e.setIsOperate(YesOrNoEnum.YES.getCode());
} else {
e.setIsOperate(YesOrNoEnum.NO.getCode());
}
});
return new PageImpl<>(list, all.getPageable(), all.getTotalElements());
}