当前位置: 首页 > 知识库问答 >
问题:

如何将实体和实体列表映射到具有嵌套列表的单个DTO?

景河
2023-03-14

我需要使用MapStruct将一些实体和实体列表转换为单个DTO。此DTO包括嵌套列表。

假设,我有以下持久性支持的POJO:

public class Entity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id")
    private Long id;

    @Column(name = "name", nullable = false)
    private String name;

    // SKIPPED

    @OneToOne(mappedBy = "entity", cascade = CascadeType.ALL)
    private EntityMetadata entityMetadata;

}   

以及这些实体的一些集合:

List<Entity> entities

DTO如下所示:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class ScreenDocumentDto { // dto
    private Long id;
    private String name;
    List<SomeLinkDto> someLinks;
}

和嵌套的DTO:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
public class SomeLinkDto {
    private Long id;
    private ZonedDateTime someDate;
}

除SomeLink列表外,我需要从实体映射的所有字段:

dto.setId(entity.getId());
dto.setName(entity.getName());
// SKIPPED

我填充的嵌套列表如下:

List<SomeLinkDto> someLinks = new ArrayList<>(entities.size());
for (Entity entity  : entities) {
    someLinks.add(SomeLinkDto.builder().id(entity.getId())
        .someDate(entity.getEntityMetadata().getSomeDate()).build());
}

结果涉及大量手动转换:

@Mapper(componentModel = "spring")
public interface ScreenDocumentMapper extends BaseMapper<Entity, ScreenDocumentDto> {
    default ScreenDocumentDto toScreenDocumentDto(List<Entity> entities, Entity entity) {
        ScreenDocumentDto dto = new ScreenDocumentDto();
        List<SomeLinkDto> someLinks = new ArrayList<>(entities.size());
        for (Entity entity  : entities) {
            someLinks.add(SomeLinkDto.builder().id(entity.getId())
                .someDate(entity.getEntityMetadata().getSomeDate()).build());
        }

        dto.setId(entity.getId());
        dto.setName(entity.getName());
        ...
        dto.setSomeLinks(someLinks);

        return dto;
    }

    // SKIPPED

有没有办法通过使用MapStruct的功能来完成同样的工作?就像这样:

@Mapper(componentModel = "spring")
public interface ScreenDocumentMapper extends BaseMapper<Entity, ScreenDocumentDto> {
    @Mappings({
        @Mapping(source = "...", target = "..."),
            ...
    })
    ScreenDocumentDto toDto(Entity entity);
}

共有2个答案

越风史
2023-03-14

在映射方法下添加如下注释。

@Mapping(target = "someLinks",expression = "java(Arrays.asList(new SomeLinkDTO(id,someDate)))"

并在mapper界面的顶部添加注释。

@Mapper(imports = {Arrays.class ,SomeLinkDTO.class})
翟理
2023-03-14

通过使用多个源参数,可以使用MapStruct实现自定义toScreenDocumentDto方法。

举个例子

@Mapper(componentModel = "spring")
public interface ScreenDocumentMapper extends BaseMapper<Entity, ScreenDocumentDto> {

    @Mapping(source = "entities", target = "someLinks")
    ScreenDocumentDto toDto(Entity entity, List<Entity> entities);

    @Mapping(source = "entityMetadata.someDate", target = "someDate")
    SomeLinkDto toLinkDto(Entity entity);
}

如果实体将链接作为属性,您可以执行以下操作:

@Mapper(componentModel = "spring")
public interface ScreenDocumentMapper extends BaseMapper<Entity, ScreenDocumentDto> {

    @Mapping(source = "links", target = "someLinks")
    ScreenDocumentDto toDto(Entity entity);

    @Mapping(source = "entityMetadata.someDate", target = "someDate")
    SomeLinkDto toLinkDto(Entity entity);
}
 类似资料:
  • 问题内容: 我正在使用Spring MVC框架编写简单的博客Web应用程序。我愿意为我的应用添加图层。 我决定使用ModelMapper框架从对象转换为视图中使用的对象。 我只有一个问题。在我的主页上,我正在显示博客中的帖子列表。在我看来,这只是(实体)对象的列表。我想更改它以将对象列表传递给我的视图。有没有什么办法来映射的对象的单方法调用的对象?我当时在考虑编写将对此进行转换的转换器,但是我不确

  • 我有一个名为Student实体,它有几个与Student相关的字段,还有一个具有一个任何关系的主题列表。在这里,我需要得到所有的字段,包括主题列表,除了“图像”,因为它使用更多的内存,它需要很长的时间来检索所有行。有没有人可以说,如何创建投影和标准,以检索这个学生对象,没有图像字段单独?有没有像“AliastObeAnneStedResultTransformer”这样的自定义结果转换器?因为在我

  • 目前,我的应用程序是这样工作的:1。应用程序从用户获得输入。2.UserRegistrationForm执行验证。3.如果没有错误,UserRegistrationForm将映射到UserEntity。4.UserEntity保存在数据库中。 我在想这是不是一个好的设计。也许我应该直接在我的用户实体中进行验证?或者也许有一种方法可以自动将表单支持对象映射到实体?

  • 如何使用MapSTRt创建映射器,从模型实体,包括一个对象列表和另一个对象到域实体,只包括嵌套对象的列表。 我的模型实体列表对象=SourceObject-A; 我的模型实体第二个对象=SourceObject-B; 我的Doamin实体列表对象=目标对象AB; 我的源代码类如下所示: SourceObject-A: SourceObject-B: 所以我需要将其转换为这个(TargetObjec

  • 我有一个名为User的域对象: 我有相关的DTO(UserDTO),它是 我想使用Dozer从域对象转换为DTO。Profile类有一个属性 我想要的是Dozer为列表中的每个配置文件获取配置文件的id并将其保存在DTO的列表中。我可以做这样的事情吗?我必须使用自定义转换器吗? 这是我的实际映射文件

  • 我有一个DTO列表,我需要将这个DTO映射到两个不同的实体对象列表。我不熟悉Java和Springboot。我找到了两个DTO映射到一个实体对象的示例。例如http://modelmapper.org/getting-started/ 个人实体- 地址实体- DTO: 我需要将上面的DTO列表映射到下面的实体对象列表: 我如何映射一个列表的人的DTO到列表的人和列表的地址?