📅  最后修改于: 2023-12-03 14:44:19.947000             🧑  作者: Mango
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 实体集合)和目标类型(即 Listmap
方法,将其映射到 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 内部集合字段类型的实体即可。