使用Mapstruct将对象列表转换为长ID列表

我正在使用MapStruct将实体转换为 DTO。

我有一个带有实体 B 列表的实体 A:

public class A {
    List<B> bs;
}

我想在 ADto 类中有一个 B id 列表:

public class ADto {
    List<Long> bIds;
}

回答

这种方法类似于L_Cleo所采用的方法,但假设我们有更多(可能很多)用例,我们希望将实体映射到它们的 id。如果您赞成我的回答,您可能还想给他们一个赞成票;我的回答受到了他们的启发。

首先,我们创建一个接口HasId,让所有具有long getId()-method 的实体实现这个接口:

public interface HasId {
  long getId();
}

@Builder
@Value
public class A implements HasId {
  long id;
  List<B> bs;
}


@Builder
@Value
public class B implements HasId {
  long id;
}

或者,如果我们已经有一个提供long getId()-method的(抽象)超类,我们可以改用这个类。它以相同的方式工作。

接下来,我们定义一个映射器,将一个HasId-entity映射到它们的id. 我们没有 MapStruct 对此的任何支持,因此我们必须手动创建此映射器:

@Mapper
public class HasIdMapper {
  final long toId(HasId entity) {
    return entity.getId();
  }
}

我们像往常一样定义我们的 Dto 类:

@Builder
@Value
public class ADto {
  List<Long> bIds;
}

最后,我们定义了从映射AADto

@Mapper(uses = HasIdMapper.class)
public interface AMapper {
  @Mapping(source = "bs", target = "bIds")
  ADto toDto(A entity);
}

这里重要的一点是 -uses属性,我们用它来触发HasIdMapper.

为了完整起见,这里有一个小测试用例:

  public static void main(String... args) {
    final A a = A.builder()
        .bs(List.of(
            B.builder().id(1).build(),
            B.builder().id(2).build(),
            B.builder().id(3).build()))
        .build();
    final ADto dto = Mappers.getMapper(AMapper.class).toDto(a);
    System.out.println(dto);
  }

这将打印出:

ADto(bIds=[1, 2, 3])


以上是使用Mapstruct将对象列表转换为长ID列表的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>