Mapstruct:将对象列表映射为两个字符串/ UUID列表

时间:2020-06-22 09:28:20

标签: mapstruct

我需要一个类的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;
}

2 个答案:

答案 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