Mapstruct一对多,逐行填充DTO

Mapstruct one to many ,fill DTO row by row

存在与实体地址具有一对多关系的客户实体,因此 Customer.Entity 中存在 List<Address> addresses=new ArrayList<> 地址具有电子邮件字段。

例如,Customer 拥有一个包含两个 elements.To 的 Address ArrayList 从您做的第一个客户那里收到一封电子邮件 customer.getAddresses.get(0).getEmail

因此,对于客户 ID =6,可以有 2 个地址,每个地址一个电子邮件。 构建 DTO 时,我只需要客户 ID 和电子邮件。

所以在那种情况下,我想要 DTO 中的两行 6 约翰@gmail.com 6 约翰2@gmail.com

就像执行 SQL 查询并为同一 ID 返回两行。

有没有办法在不执行任何操作的情况下使用 Mapstruct 做到这一点 sql?就像遍历一个集合?

我不确定我明白你想要什么。 Mapstruct 用于映射而不是应用逻辑。您描述的情况是我将使用 SQL 或板载 java 实用程序解决的问题。

我的方法是这样的

package mapping;

import lombok.Builder;
import lombok.Data;

import java.util.ArrayList;
import java.util.Arrays;
import java.util.List;
import java.util.stream.Collectors;

public class MappingMain {
    public static void main(String[] args) {
        Customer customer = Customer.
                builder()
                .id(1)
                .name("John")
                .adresses(Arrays.asList(                                          
Address.builder().email("john@gmail.com").street("exampleStreet1").build(),                        
Address.builder().email("john2@gmail.com").street("exampleStreet2").build()))
                .build();

    //single customer
    List<ResultingDTO> resultingDTOS =
            customer.getAdresses()
                    .stream()
                    .map(Address::getEmail)
                    .map(email ->
                            ResultingDTO.builder().email(email).id(customer.getId()).build()
                        )
                    .collect(Collectors.toList());
    System.out.println(resultingDTOS);


    //multiple customer "select" by id
    List<Customer> listOfCustomers = Arrays.asList(customer, Customer.builder().id(33).build());

    List<ResultingDTO> resultList = new ArrayList<>();
    listOfCustomers
            .stream()
            .filter(singleCustomer -> singleCustomer.getId() == 1)
            .forEach(customerWithId_1 -> {
                resultList.addAll(customerWithId_1.getAdresses()
                        .stream()
                        .map(Address::getEmail)
                        .map(email ->
                                ResultingDTO.builder().email(email).id(customer.getId()).build()
                        )
                        .collect(Collectors.toList()));
            });
    System.out.println(resultList);

    }

    @Data
    @Builder
    public static class Customer {
        private int id;
        private String name;
        private List<Address> adresses;
    }

    @Data
    @Builder
    public static class Address {
        private String street;
        private String email;
    }

    @Data
    @Builder
    public static class ResultingDTO {
        private int id;
        private String email;
    }


}