Java 将@ManyToMany集合映射到ID集合

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

我正在尝试映射一个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 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();
    }
}