这是一个springboot项目,我需要使用父级的指定字段和每个子级的newest
个指定字段为仪表板视图构建DTO.
实体为飞机
,与应答器、维护判断和emits 机有一对一的关系.
飞机
@Entity
@Data
public class 飞机 {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
private String registration;
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy = "plane")
private List<应答器> list应答器 = new ArrayList<>();
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy = "plane")
private List<Transmitter> listTransmitter = new ArrayList<>();
@JsonIgnore
@OneToMany(cascade = CascadeType.ALL, mappedBy = "plane")
private List<MaintCheck> listMaintCheck = new ArrayList<>();
应答器
@Entity
@Data
@NoArgsConstructor
@AllArgsConstructor
public class 应答器 {
@Id
@GeneratedValue(strategy = IDENTITY)
private Long id;
private String code;
private LocalDate dateInserted;
@ManyToOne(fetch = FetchType.LAZY, optional = true)
private 飞机 plane;
}
Maint Check
和Transmitter
具有具有LocalDate字段的类似实体.
飞机DTO looks liike
@Data
public class 飞机DTO {
private String registration;
private LocalDate maintCheck; // date of most recent Maint Check
private String transponderCode; // string of most recent 应答器 code
private Integer channel; // Intger of most recent Transmitter Freq
}
I have attempted to consruct this 飞机DTO in the service layer, but I am manually doing much of the sorting of the lists of 应答器, Transmitter and Maint Check to get the most recent record from these lists.
//DRAFT METHOD CONSTRUCT DTO
@Override
public 飞机SummaryDTO get飞机SummaryDTOById(Long id) {
飞机 飞机 = this.get(id);
飞机SummaryDTO 飞机SummaryDTO = new 飞机SummaryDTO();
ModelMapper mapper = new ModelMapper();
飞机SummaryDTO = modelMapper.map(get(id), 飞机SummaryDTO.class);
飞机SummaryDTO.setTRANSPONDERCode(getNewestTRANSPONDERCode(飞机));
飞机SummaryDTO.setLastMaintCheck(getNewestMaintCheckDate(飞机));
飞机SummaryDTO.setChannel(getTransmitterCode(飞机));
飞机SummaryDTO.setChannelOffset(getTransmitterOffset(飞机));
return 飞机SummaryDTO;
}
// RETURN NEWEST DATE OF MAINT CHECK BY CATCH DATE
public LocalDate getNewestMaintCheckDate(飞机 飞机) {
List<MaintCheck> listMaintCheck = new ArrayList<>(飞机.getListMaintCheck());
MaintCheck newest = listMaintCheck.stream().max(Comparator.comparing(MaintCheck::getCatchDate)).get();
return newest.getCatchDate();
}
// RETURN NEWEST TRANSPONDER CODE FROM 飞机 BY DATE INSERTED
public String getNewest应答器Code(飞机 飞机) {
List<应答器> list应答器 = new ArrayList<>(飞机.getList应答器());
应答器 newest = list应答器.stream().max(Comparator.comparing(应答器::getDateInserted)).get();
return newest.getCode();
}
// OTHER METHODS TO GET MOST RECENT RECORD
QUESTION是否有更好的方法来计算子元素的最新记录,更有效地使用模型映射器(自定义方法?)
如果MapStruct更好地支持获取最近的子元素,我愿意更改为MapStruct.