将@ManyToMany集合映射到ID集合

时间:2020-05-26 08:14:15

标签: 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映射到字符串,提取其id,可能是@Named。使用类似String mapToProductId(Product product)的东西,但是@Mapping注释需要一个target,在这种情况下,它就是字符串(值)本身。我不确定这是否完全可行,我看了文档,示例,用户组和Stackoverflow,都无济于事。

因此,在这一点上,自己实现Recipe的整个映射会更容易,但是我不禁感到自己缺少某些东西。有更好的方法吗?

1 个答案:

答案 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();
    }
}