java - 将 @ManyToMany 集合映射到 ID 集合

标签 java mapstruct

我正在尝试映射一个 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/

相关文章:

java - 错误处理系统如何处理错误?

java - 如何关闭 tomcat 7 中的 jul 日志格式?

java - EJB 与 Hibernate

使用 @aftermapping 进行 MapStruct 批量转换

java - 映射嵌套 beans 列表 : "org.mapstruct.Mapping"

java - MapStruct:如何过滤要使用的后映射方法?

java - 不需要父构造函数的子类

Java JSONArray 抛出意外异常

Mapstruct - 更新现有的 bean 并忽略一个字段

java - 使用mapstruct映射不同类型列表的元素