Mapstruct:更新集合中的各个模型

Sah*_*heb 6 java collections java-8 mapstruct

我正在尝试使用这样的映射结构更新集合:

List<Passenger> updatePassengers(@MappingTarget List<Passenger> passengers, List<Passenger> sourcePassenger);
Passenger updatePassenger(@MappingTarget Passenger passenger, Passenger sourcePassenger);
Run Code Online (Sandbox Code Playgroud)

现在在生成的源中 updatePassenger 方法生成如下:

public List<Passenger> updatePassengers(List<Passenger> passengers, List<Passenger> sourcePassenger) {
    if ( sourcePassenger == null ) {
        return null;
    }

    passengers.clear();
    for ( Passenger passenger : sourcePassenger ) {
        passengers.add( passenger );
    }

    return passengers;
}
Run Code Online (Sandbox Code Playgroud)

这里是将乘客从目的地移走,并将乘客从源地设置。我想更新个别乘客对象。

我浏览了 mapstruct 文档,它说它在更新之前清除集合。

有没有一种方法可以为每个乘客调用 updatePassenger 方法?

Fil*_*lip 3

如果您不希望 MapStruct 启动默认行为,您应该编写自己的自定义方法来执行更新。

default List<Passenger updatePassengers(List<Passenger> passenger, Lit<Passenger> sourcePassengers) {
    //Do your logic here
}
Run Code Online (Sandbox Code Playgroud)

最重要的是,MapStruct 无法生成您需要的代码,它不知道哪个乘客应该与哪个乘客链接。

在您的定义中,您是说您希望passenger列表随sourcePassengers列表一起更新。

  • @Filip 无法通过对列表中的每个元素进行相等性检查(比较源和目标)来查找它是否已存在来自动执行此操作,如果存在则使用单独的“update”方法,否则使用单独的“create”方法` 方法?这似乎是一种有效的方法,所以我猜想 MapStruct,在提供这个答案几年后,现在可能支持这样的功能。我个人会喜欢这个,因为我们使用 DTO 来更新已填充列表的 JPA 实体:因此主键可用于知道要更新哪个实体。 (2认同)
  • @payne 和 @Filip 这是一个好主意,使用 Java“等于”检查并相应地“更新”或“创建”目标集合项!将为 MapStruct 用户节省大量时间!例如可以引入新的注释模式:`Mapping(collectionMatchStrategy = CollectionMatchStrategy.EQUALS)` (2认同)