Сопоставление коллекции @ManyToMany с коллекцией идентификаторов - PullRequest
1 голос
/ 26 мая 2020

Я пытаюсь сопоставить объект JPA (Recipe), содержащий коллекцию различных Product s с ассоциацией многие-ко-многим.

@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;
}

Для результата меня интересуют только идентификаторы этих сущностей:

@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, которым в данном случае будет сама строка (значение). Я не уверен, возможно ли это вообще, я просмотрел документацию, примеры, группу пользователей и Stackoverflow, но безрезультатно.

Итак, на данном этапе было бы проще чтобы реализовать все отображение Recipe самостоятельно, но я не могу не чувствовать, что что-то упускаю. Есть ли лучший способ сделать это?

1 Ответ

1 голос
/ 26 мая 2020

Полагаю, вам нужно реализовать 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();
    }
}
...