我需要一个类的mapstruct映射,该类具有以这种方式映射到目标类的对象列表:
//Source class:
public class VoucherTransaction {
private List<Voucher> vouchers;
}
//TargetClass
public class VoucherTransactionServiceDTO {
private List<UUID> voucherIds;
private List<String> voucherSerials;
}
public class Voucher {
private UUID id;
private String serial;
}
答案 0 :(得分:1)
在您的mapper类中,您可以为每个目标使用表达式,并为目标中的每个列表实现单独的默认映射。
@Mapping(target = "voucherIds", expression = "java( mapVoucherListToVoucherIdList(transaction.getVouchers()) )")
@Mapping(target = "voucherSerials", expression = "java( mapVoucherListToVoucherSerialList(transaction.getVouchers()) )")
public VoucherTransactionServiceDTO TransactionToServiceDTO(VoucherTransaction transaction);
default List<UUID> mapVoucherListToVoucherIdList(List<Voucher> vouchers) {
List<UUID> voucherIds = new ArrayList<>();
if (vouchers != null && !vouchers.isEmpty())
voucherIds = vouchers.stream().map(Voucher::getId).collect(Collectors.toList());
return voucherIds;
}
default List<String> mapVoucherListToVoucherSerialList(List<Voucher> vouchers) {
List<String> voucherSerials = new ArrayList<>();
if (vouchers != null && !vouchers.isEmpty())
voucherSerials = vouchers.stream().map(Voucher::getSerial).collect(Collectors.toList());
return voucherSerials;
}
答案 1 :(得分:0)
如果您定义了可以在不同列表类型之间进行映射的方法,或者列表对象与其他对象进行映射,则mapstruct将识别它们并进行映射。
例如
SELECT
ms.id,
ms.product_id,
ms.product_name,
ms.purch_gst,
ms.gst,
SUM(ms.product_price * ms.product_quantity) AS product_total,
SUM(ms.purch_price * ms.product_quantity) AS purch_total,
SUM(ms.product_quantity) AS total_quantity
FROM
master_stock ms
GROUP BY
ms.product_id
ORDER BY
ms.product_id
然后,MapStruct将在@Mapper
public interface VoucherTransactionMapper {
@Mapping(target = "voucherIds", source = "vouchers")
@Mapping(target = "voucherSerials", source = "vouchers")
public VoucherTransactionServiceDTO map(VoucherTransaction transaction);
default UUID voucherToUuid(Voucher voucher) {
return voucher != null ? voucher.getId() : null;
}
default String voucherToSerial(Voucher voucher) {
return voucher != null ? voucher.getSerial() : null;
}
}
和List<Voucher>
与List<UUID>
和List<Voucher>
之间生成映射,并使用映射器中定义的默认方法来执行映射。
您还可以定义列表映射方法,MapStruct会改用它们:
例如
List<String>
对于更高级的用法,您可以使用Mapping method selection based on qualifiers