我有一個看起來像這樣的訂單物體
@Entity
@JsonIdentityInfo(generator = ObjectIdGenerators.PropertyGenerator.class, property = "id")
@Table(name = "orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private int id;
@Enumerated(EnumType.STRING)
@Column(name = "order_status")
private OrderStatus status;
@ManyToMany(cascade = {CascadeType.MERGE, CascadeType.PERSIST, CascadeType.DETACH, CascadeType.REFRESH})
@JoinTable(name = "order_product"
,joinColumns = @JoinColumn(name = "order_id")
,inverseJoinColumns = @JoinColumn(name = "product_id"))
private List<Product> productList;
@ManyToOne
@JoinColumn(name = "user_id")
private User user;
@Column(name = "ordered_at")
private LocalDateTime orderTime;
@OneToOne
@JoinTable(name = "order_payment"
,joinColumns = @JoinColumn(name = "order_id",referencedColumnName = "id")
,inverseJoinColumns = @JoinColumn(name = "payment_id", referencedColumnName = "id"))
private Payment payment;
@ManyToOne
@JoinColumn(name = "shop_id")
private Shop shop;
...
contsructor getter and setters
}
OrderPostDto
public class OrderPostDto {
private int id;
private OrderStatus status;
private int userId;
private LocalDateTime orderTime;
private List<Integer> productIds;
private int shopId;
...
constructor getter and setters
}
MapStruct 訂單映射器
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR, uses = {ProductService.class, ShopService.class, UserService.class})
public interface OrderMapper {
OrderMapper INSTANCE = Mappers.getMapper(OrderMapper.class);
OrderDto orderToDto(Order order);
@Mapping(source = "userId", target = "user")
@Mapping(source = "productIds", target = "productList")
@Mapping(source = "shopId", target = "shop")
Order dtoToOrder(OrderPostDto dto);
}
如您所見,OrderDto 接受產品 id 作為整數,OrderMapper 應該將它們映射到產品資料庫表中的物件。但它會生成如下代碼:
protected List<Product> integerListToProductList(List<Integer> list) {
if ( list == null ) {
return null;
}
List<Product> list1 = productService.getAllProducts();
for ( Integer integer : list ) {
list1.add( productService.getProductById( integer.intValue() ) );
}
return list1;
}
但由于某種原因,它創建了 list1 ,其中包含資料庫中的所有專案List<Product> list1 = productService.getAllProducts();
但我需要實作這種行為List<Product> list1 = new ArrayList<>(list.size());我如何讓它以這種方式生成?
uj5u.com熱心網友回復:
我已經解決了我的問題,我只是將 mapper 定義為一個抽象類,并實作了這個特定的方法。所以它看起來像這樣:
@Mapper(componentModel = "spring", injectionStrategy = InjectionStrategy.CONSTRUCTOR, uses = {ProductService.class, ShopService.class, UserService.class})
public abstract class OrderMapper {
@Autowired
protected ProductService productService;
public abstract OrderDto orderToDto(Order order);
@Mapping(source = "userId", target = "user")
@Mapping(source = "productIds", target = "productList")
@Mapping(source = "shopId", target = "shop")
public abstract Order dtoToOrder(OrderPostDto dto);
public List<Product> integerListToProductList(List<Integer> list) {
if ( list == null ) {
return null;
}
List<Product> list1 = new ArrayList<>(list.size());
for ( Integer integer : list ) {
list1.add( productService.getProductById( integer.intValue() ) );
}
return list1;
}
}
轉載請註明出處,本文鏈接:https://www.uj5u.com/qukuanlian/511720.html
標籤:春天弹簧靴地图结构
