使用 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;
但其实我想要
- 只有return个人的首选地址(只能有一个)。
- 仅获取地址
的嵌套 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);
}
}
我有那种关系(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;
但其实我想要
- 只有return个人的首选地址(只能有一个)。
- 仅获取地址 的嵌套 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);
}
}