这是一个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 CheckTransmitter具有具有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.

推荐答案

我过go 曾短暂使用ModelMapper.我建议使用mapstruct,因为我个人觉得它更容易使用.我知道你的 map 可以在那里完成;).在Mapstruct中,您的映射器可以如下所示:

@MapperConfig(
        componentModel = "spring",
        builder = @Builder(disableBuilder = true)
)
public interface PlaneMapper {

    @Mapping(target = "lastMaintCheck", ignore = true)
    PlaneDTO planeToPlaneDTO(Plane plane);

    @AfterMapping
    default void customCodePlaneMapping(Plane source, @MappingTarget PlaneDTO target) {
        target.setLastMaintCheck(source.getListMaintCheck.stream().max(Comparator.comparing(Transponder::getDateInserted)).get())
   }

您的mapper呼叫将只有一行:

@Service
@RequiuredArgsConstructor
public class someService{

    private final PlaneMapper planeMapper;

    public void someMethod(){
        ....
        PlaneDTO yourMappedPlaneDTO = planeMapper.planeToPlaneDTO(plane);
        ....
    }

我没有填写所有的值.但我希望这个概念是明确的.

编辑:

您还必须添加"mapstruct processor"的依赖项,以便对MapperImpl类进行分级.

    <dependency>
        <groupId>org.mapstruct</groupId>
        <artifactId>mapstruct-processor</artifactId>
        <version>${org.mapstruct.version}</version>
        <scope>provided</scope>
        <optional>true</optional>
    </dependency>

Java相关问答推荐

具有默认分支的JUnit代码覆盖率切换声明

路径映射未发生

FALSE:它应该在什么时候使用?

为什么不应用类型推断?

Spring Boot Maven包

我无法获取我的Java Spring应用程序的Logback跟踪日志(log)输出

蒙蒂霍尔比赛结果不正确

生成桥方法以解决具有相同擦除的冲突方法

使用存储在字符串变量中的路径目录打开.pdf文件

如何在构建Gradle项目时排除com.google.guava依赖项的一个变体

对从Spring Boot 3.1.5升级到3.2.0的方法的查询验证失败

无法使用Java PreparedStatement在SQLite中的日期之间获取结果

如何从命令行编译包中的所有类?

如何调整JButton的大小以适应图标?

如何在Spring Boot中为不同的部署环境管理多个.properties文件?

如何使用Rascal Evaluator从编译的JAR访问Rascal函数?

当我try 返回可选时,Mock无法正常工作

无泄漏函数的Java DRY

如何在Java中调用对象上预定义的接口方法列表?

在Java中,在Object#equals()调用期间,两个对象是否必须具有相同的hashCode?我们是否需要在 equals() 中比较 hashCode?