使用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;
}
最后,我们定义了从映射A到ADto:
@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])