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;
}
}
存在与实体地址具有一对多关系的客户实体,因此 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;
}
}