我正在尝试映射一个JPA实体(Recipe
),该实体包含具有多对多关联的不同Product
的集合。
@Data
public class Recipe {
private String id;
//ManyToMany
private Set<Product> products;
}
@Data
public class Product {
private String id;
private String name;
//ManyToMany
private Set<Recipe> recipes;
}
对于结果,我只对那些实体的ID感兴趣:
@Data
public class RecipeDTO {
private String id;
private Set<String> productIds;
}
因此导致了该映射器:
@Mapper
public interface RecipeMapper {
@Mapping(target = "productIds", source = "products.id")
RecipeDTO mapToDto(Recipe recipe);
}
现在,这不起作用:
RecipeMapper.java:8: error: No property named "products.id" exists in source parameter(s). Did you mean "products.empty"?
@Mapping(target = "productIds", source = "products.id")
^
太糟糕了。我希望它能像这样工作,但是这是行不通的。我的下一个想法是定义一种方法,将Product
映射到字符串,提取其id
,可能是@Named
。使用类似String mapToProductId(Product product)
的东西,但是@Mapping
注释需要一个target
,在这种情况下,它就是字符串(值)本身。我不确定这是否完全可行,我看了文档,示例,用户组和Stackoverflow,都无济于事。
因此,在这一点上,自己实现Recipe
的整个映射会更容易,但是我不禁感到自己缺少某些东西。有更好的方法吗?
答案 0 :(得分:1)
我想您需要实现String mapToProductId(Product product)
并将“ products.id”更改为“ products”,例如:
@Mapper
public interface RecipeMapper {
@Mapping(target = "productIds", source = "products")
RecipeDTO mapToDto(Recipe recipe);
default String mapToProductId(Product product) {
return product.getId();
}
}