📜  ModelMapper 将实体映射到 Dto 时,有没有办法自动将实体集合映射到 Dto 内部集合字段? (1)

📅  最后修改于: 2023-12-03 14:44:19.947000             🧑  作者: Mango

使用 ModelMapper 自动映射实体集合到 Dto 内部集合字段

简介

ModelMapper 是一个 Java 对象映射库,可用于将一个对象映射到另一个对象,也可以用来进行深层次的映射。在使用 ModelMapper 进行实体映射时,我们可以使用以下方法将实体集合映射到 Dto 内部的集合字段:

modelMapper.map(sourceList, destinationListType)

该方法需要两个参数,第一个是源实体集合,第二个是目标 Dto 内部集合字段的类型。ModelMapper 将自动将源实体集合中的每个实体映射为目标 Dto 内部集合字段类型的实体,并将映射后的实体添加到目标 Dto 内部集合字段中。

示例

假设我们有如下两个实体类和一个 Dto 类:

public class User {
    private Long id;
    private String name;
    private Integer age;

    // getters and setters
}

public class Order {
    private Long id;
    private User user;
    private BigDecimal price;

    // getters and setters
}

public class OrderDto {
    private Long id;
    private UserDto userDto;
    private BigDecimal price;
    private List<ItemDto> items;

    // getters and setters
}

public class UserDto {
    private Long id;
    private String name;
    private Integer age;

    // getters and setters
}

public class ItemDto {
    private Long id;
    private String name;
    private Integer quantity;

    // getters and setters
}

我们可以使用 ModelMapper 将 Order 实体映射为 OrderDto:

ModelMapper modelMapper = new ModelMapper();

Order order = new Order();
order.setId(1L);

User user = new User();
user.setId(2L);
user.setName("John");
user.setAge(30);

order.setUser(user);
order.setPrice(BigDecimal.valueOf(100));

OrderDto orderDto = modelMapper.map(order, OrderDto.class);

此时,orderDto 的 id 和 price 属性已经被映射成功,但是 userDto 和 items 属性中的数据尚未映射。如果我们想要将 Order 实体中的 User 实体映射到 OrderDto 内部的 UserDto 实体中,我们可以在 Dto 中定义一个对应的 UserDto 类,然后使用 ModelMapper 将 User 实体映射为 UserDto 实体:

UserDto userDto = modelMapper.map(user, UserDto.class);

此时,userDto 就包含了从 user 中映射出的 id、name 和 age 属性。现在,我们可以将 userDto 赋值给 orderDto 中的 userDto 属性,并将 items 属性都设为 null,然后将源实体集合(即 Order 实体集合)和目标类型(即 List 类型)传递给 map 方法,将其映射到 orderDto 的 items 属性中:

orderDto.setUserDto(userDto);
orderDto.setItems(null);

List<Order> orders = new ArrayList<>();
orders.add(order);
orderDto.setItems(modelMapper.map(orders, new TypeToken<List<ItemDto>>() {}.getType()));

现在,orderDto 中的所有属性都已经被映射成功。

总结

使用 ModelMapper 自动映射实体集合到 Dto 内部集合字段,可以简化我们进行实体映射的代码编写。只需要将源实体集合和目标 Dto 内部集合字段类型传递给 map 方法即可完成自动映射。要实现这一功能,我们需要在 Dto 中定义对应的实体类,并将源实体集合中的每个实体映射为目标 Dto 内部集合字段类型的实体即可。