使用 OneToMany 关系从实体 Class 添加 ModelMapper 映射到 Dto Class

Add ModelMapper Maping from Entity Class to Dto Class with OneToMany relationship

我有那种关系(Spring 启动 JPA 实现):

一个人有多个地址

一个地址包含一个国家

public class Person {
    
private Integer id;
private Integer name;
private Integer age;

//relations
}
  
        
public class Address {
    
private Integer id;
private Integer person_id;
private String street;
private String city;
private String country_id;
private Boolean preferred;

//relations
}
        
public class Country {
    
private Integer id;
private Integer description;

//relations

我想要 return 这样的 DTO

public class PersonDto {

 private Integer id;
 private Integer name;
 private Integer age;
 private String street;
 private String city;
 private Integer country //description;

但其实我想要

  1. 只有return个人的首选地址(只能有一个)。
  2. 仅获取地址
  3. 的嵌套 class 中的国家/地区描述

可以使用 ModelMapper(AddMapping 策略)

谢谢,

其中一种选择是使用 Converter

import org.modelmapper.Converter;
import org.modelmapper.spi.MappingContext;

public class PersonToDtoConverter implements Converter<Person, PersonDto> {

  @Override
  public PersonDto convert(MappingContext<Person, PersonDto> context) {
    Person source = context.getSource();
    PersonDto destination = context.getDestination();
    if (destination == null) {
      destination = new PersonDto();
    }
    destination.setId(source.getId());
    destination.setName(source.getName());
    destination.setAge(source.getAge());
    Address address = source.getAddresses().stream().filter(Address::getPreferred).findFirst().orElse(null);
    if (address != null) {
      destination.setStreet(address.getStreet());
      destination.setCity(address.getCity());
      destination.setCountry(address.getCountry().getDescription());
    }
    return destination;
  }
}

然后您需要使用 ModelMapper 实例注册转换器。

import org.modelmapper.ModelMapper;

import java.util.ArrayList;
import java.util.List;

public class Mappings {

  public static void main(String[] args) {
    //setup
    Country germany = new Country();
    germany.setId(1);
    germany.setDescription(11);
    Address address = new Address();
    address.setCountry(germany);
    address.setCity("Munich");
    address.setId(1);
    address.setCountry_id("DE");
    address.setStreet("some street");
    address.setPreferred(true);
    address.setPerson_id(1);
    Person person = new Person();
    person.setId(1);
    person.setAge(29);
    person.setName(111);
    List<Address> addresses = new ArrayList<>();
    addresses.add(address);
    person.setAddresses(addresses);

    //convert
    ModelMapper modelMapper = new ModelMapper();
    modelMapper.addConverter(new PersonToDtoConverter());
    PersonDto personDto = modelMapper.map(person, PersonDto.class);
    System.out.println(personDto);
  }
}