我正在尝试映射一个 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
映射到 String,提取它的 id
,可能是 @Named
。使用类似于 String mapToProductId(Product product)
的东西,但是 @Mapping
注释需要一个 target
,在本例中是 String (value ) 本身。我不确定这是否完全可行,我查看了文档、示例、用户组和 Stackoverflow,但都无济于事。
所以,在这一点上,自己实现 Recipe
的整个映射会更容易,但我不禁觉得自己缺少了一些东西。有更好的方法吗?
最佳答案
我想您需要实现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();
}
}
关于java - 将 @ManyToMany 集合映射到 ID 集合,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62017472/