Java 将@ManyToMany集合映射到ID集合
我正在尝试映射一个JPA实体(Java 将@ManyToMany集合映射到ID集合,java,mapstruct,Java,Mapstruct,我正在尝试映射一个JPA实体(Recipe),其中包含具有多对多关联的不同产品的集合 @Data public class Recipe { private String id; //ManyToMany private Set<Product> products; } 现在,这不起作用: RecipeMapper.java:8: error: No property named "products.id" exists in source paramete
Recipe
),其中包含具有多对多关联的不同产品的集合
@Data
public class Recipe {
private String id;
//ManyToMany
private Set<Product> products;
}
现在,这不起作用:
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")
^
太糟糕了。我希望它能像这样工作,但它不起作用是有道理的。我的下一个想法是定义一个方法,将产品
映射到一个字符串,提取其id
,可能是@Named
。使用类似于String mapToProductId(Product)
,但是@Mapping
注释需要一个目标,在本例中,该目标就是字符串(值)本身。我不确定这是否是可能的,我查看了文档、示例、用户组和Stackoverflow,但没有结果
因此,在这一点上,实现Recipe
的整个映射将更容易,但我忍不住觉得自己遗漏了什么。有更好的方法吗?我想您需要实现字符串mapToProductId(产品)
并将“products.id”更改为“products”,如:
我想你应该把products.id
发回product.id
。因为没有Products类,所以它是Product类。不过我希望有另一种方法,因为在我的用例中有多个这样的集合(不仅仅是本例中的集合),所以我必须实现每一个集合,以及其他方法,而不是使用类似于@inheritationinverseconfiguration
的东西。此时,只需自己实现整个映射器就更有意义了。我想您可以通过实现mapToProductId
方法来实现ProductToIdMapper
,然后在其他地方重用映射器。类似于@Mapper(uses=ProductToIdMapper.class)
。另外,我看不出如何将字符串映射到Product,然后使用@InheritationInverseConfiguration
,只需将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")
^
@Mapper
public interface RecipeMapper {
@Mapping(target = "productIds", source = "products")
RecipeDTO mapToDto(Recipe recipe);
default String mapToProductId(Product product) {
return product.getId();
}
}