Mapstruct

1. How to map different field name:

package com.example.demo2.enums;

public enum Brand {
MERCEDES,
BMW,
TOYOTA,
FIAT
}
package com.example.demo2.entity;

import com.example.demo2.enums.Brand;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.Hibernate;

import java.util.Objects;

@Getter
@Setter
@ToString
@RequiredArgsConstructor
@Entity
public class Car {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(value = EnumType.STRING)
private Brand brand;
private String model;

@ToString.Exclude
@OneToOne(mappedBy = "car", orphanRemoval = true)
private Person person;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Car car = (Car) o;
return id != null && Objects.equals(id, car.id);
}

@Override
public int hashCode() {
return getClass().hashCode();
}

} 


package com.example.demo2.dto;

import com.example.demo2.enums.Brand;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarDto {

private Brand brand;
private String modelName;
}
package com.example.demo2.mapper;

import com.example.demo2.dto.CarDto;
import com.example.demo2.entity.Car;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface CarMapper {

@Mapping(target = "model", source = "modelName")
Car toEntity(CarDto dto);

@Mapping(target = "modelName", source = "model")
CarDto toDto(Car car);
}


2. Multiple sources mapping:

package com.example.demo2.entity;

import lombok.Data;

@Data
public class A {
private String one;
private String two;
}
package com.example.demo2.entity;

import lombok.Data;

@Data
public class B {
private String three;
private String four;
}
package com.example.demo2.dto;

import lombok.Data;

@Data
public class ABDto {
private String one;
private String two;
private String three;
private String four;
}


package com.example.demo2.mapper;

import com.example.demo2.dto.ABDto;
import com.example.demo2.entity.A;
import com.example.demo2.entity.B;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface ABMapper {

@Mapping(source = "a.onee", target = "one")
ABDto toABDto(A a, B b);

@Mapping(source = "dto.one", target = "onee")
A toA(ABDto dto);

B toB(ABDto dto);
}


3. Nested bean properties mapping:

package com.example.demo2.entity;

import jakarta.persistence.*;
import lombok.*;
import org.hibernate.Hibernate;

import java.util.Objects;

@Getter
@Setter
@ToString
@RequiredArgsConstructor
@Entity
public class Person {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
private String name;
private String surname;

@OneToOne(cascade = CascadeType.ALL, orphanRemoval = true)
@JoinColumn(name = "car_id")
private Car car;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Person person = (Person) o;
return id != null && Objects.equals(id, person.id);
}

@Override
public int hashCode() {
return getClass().hashCode();
}
}


package com.example.demo2.entity;

import com.example.demo2.enums.Brand;
import jakarta.persistence.*;
import lombok.*;
import org.hibernate.Hibernate;

import java.util.Objects;

@Getter
@Setter
@ToString
@RequiredArgsConstructor
@Entity
public class Car {

@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
private Long id;
@Enumerated(value = EnumType.STRING)
private Brand brand;
private String model;

@ToString.Exclude
@OneToOne(mappedBy = "car", orphanRemoval = true)
private Person person;

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || Hibernate.getClass(this) != Hibernate.getClass(o)) return false;
Car car = (Car) o;
return id != null && Objects.equals(id, car.id);
}

@Override
public int hashCode() {
return getClass().hashCode();
}
}


package com.example.demo2.dto;

import com.example.demo2.enums.Brand;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class CarDto {

private Brand brand;
private String model;
}


package com.example.demo2.dto;

import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;

@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
public class PersonDto {

private String name;
private String surname;
private CarDto carDto;
}


package com.example.demo2.mapper;

import com.example.demo2.dto.PersonDto;
import com.example.demo2.entity.Person;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Mappings;
import org.mapstruct.ReportingPolicy;

@Mapper(componentModel = "spring", unmappedTargetPolicy = ReportingPolicy.IGNORE)
public interface PersonMapper {


@Mappings({
@Mapping(source = "dto.carDto.brand", target = "car.brand"),
@Mapping(source = "dto.carDto.model", target = "car.model")
})
Person dtoToEntity(PersonDto dto);

@Mappings({
@Mapping(source = "person.car.brand", target = "carDto.brand"),
@Mapping(source = "person.car.model", target = "carDto.model")
})
PersonDto entityToDto(Person person);
}


4. Custom mapping:

package com.example.demo2.entity;

import lombok.Data;

@Data
public class Cars {
private String regNumber;
private String modelNumber;
private String company;
private Driver driver;
}
package com.example.demo2.entity;

import lombok.Data;

@Data
public class Driver {
private String name;
private Integer expiresIn;
}
package com.example.demo2.dto;

import com.example.demo2.entity.Driver;
import lombok.Data;

@Data
public class CarsDto {
private String regNumber;
private String modelNumber;
private String company;
private DriverDto driverDto;
}
package com.example.demo2.dto;

import lombok.Data;

@Data
public class DriverDto {
private String name;
private Integer expiresIn;
}
package com.example.demo2.mapper;

import com.example.demo2.dto.CarsDto;
import com.example.demo2.dto.DriverDto;
import com.example.demo2.entity.Cars;
import com.example.demo2.entity.Driver;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;

@Mapper(componentModel = "spring")
public abstract class CarDriverMapper {

@Mapping(target = "driverDto", source = "cars.driver", qualifiedByName = "driverToDriverDto")
public abstract CarsDto toCarDto(Cars cars);

@Named(value = "driverToDriverDto")
public DriverDto driverToDriverDto(Driver driver) {
DriverDto dto = new DriverDto();
dto.setName(driver.getName());
dto.setExpiresIn(driver.getExpiresIn());
return dto;
}
}

veya

package com.example.demo2.mapper;

import com.example.demo2.dto.CarsDto;
import com.example.demo2.dto.DriverDto;
import com.example.demo2.entity.Cars;
import com.example.demo2.entity.Driver;
import org.mapstruct.Mapper;
import org.mapstruct.Mapping;
import org.mapstruct.Named;

@Mapper(componentModel = "spring")
public interface CarDriverMapper {

@Mapping(target = "driverDto", source = "cars.driver", qualifiedByName = "driverToDriverDto")
CarsDto toCarDto(Cars cars);

@Named(value = "driverToDriverDto")
default DriverDto driverToDriverDto(Driver driver) {
DriverDto dto = new DriverDto();
dto.setName(driver.getName());
dto.setExpiresIn(driver.getExpiresIn());
return dto;
}
}


































Комментарии

Популярные сообщения из этого блога

Lesson1: JDK, JVM, JRE

SE_21_Lesson_11: Inheritance, Polymorphism

SE_21_Lesson_9: Initialization Blocks, Wrapper types, String class