将@ManyToMany集合映射为ID集合

问题描述 投票:0回答:1

我正在尝试映射一个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的整个映射会更容易,但是我不禁感到自己缺少了一些东西。有更好的方法吗?

java mapstruct
1个回答
0
投票

我想您需要实现String mapToProductId(Product product) a:

@Mapper
public interface RecipeMapper {
    @Mapping(target = "productIds", source = "products")
    RecipeDTO mapToDto(Recipe recipe);

    default String mapToProductId(Product product) {
      return product.getId();
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.