Проекция Micronaut Data DTO со свойствами присоединяемых объектов - PullRequest
1 голос
/ 28 сентября 2019

Я использую Micronaut Data с JPA и имею две сущности.Первый - Recipe:

@Entity
public class Recipe {
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer id;

    private String name;

    @ManyToOne
    private Category category;

    @OneToMany(mappedBy = "recipe", cascade = CascadeType.ALL, orphanRemoval = true, fetch = FetchType.LAZY)
    private Set<Step> steps;

// + other fields, getters and setters
}

Второй - ParseError, что относится к Recipe:

@Entity
@Table(name = "parse_error")
public class ParseError implements Serializable {
    @Id
    @ManyToOne(fetch = FetchType.LAZY)
    private Recipe recipe;

    @Id
    @Enumerated(EnumType.ORDINAL)
    @Column(name = "problem_area")
    private ProblemArea problemArea;

    private String message;

// + other fields, getters and setters
}

Теперь я хотел бы предоставить DTO в API сParseError свойств, но не со всей сущностью Recipe, поскольку она содержит отношения ManyToOne и OneToMany, которые в этом случае не нужны.Поэтому я создал проекцию DTO для этого:

@Introspected
public class ParseErrorDto {
    private Integer recipeId;

    private String recipeName;

    private ParseError.ProblemArea problemArea;

    private String message;

// + getters and setters
}

И добавил listAll() метод в ParseErrorRepository:

@Repository
public interface ParseErrorRepository extends CrudRepository<ParseError, Integer> {
    List<ParseErrorDto> listAll();
}

Но похоже, что Micronaut Data не может проецировать свойства извложенные сущности или я что-то пропустил в DTO или методе репозитория:

ParseErrorRepository.java: 22: ошибка: невозможно реализовать метод репозитория: ParseErrorRepository.listAll ().Свойство recipeId отсутствует в сущности: ParseError

Я также пытался создать RecipeDto:

@Introspected
public class RecipeDto {
    private Integer id;

    private String name;

    // + getters and setters
}

И обновил ParseErrorDto соответственно:

@Introspected
public class ParseErrorDto {
    private RecipeDto recipe;

    private ParseError.ProblemArea problemArea;

    private String message;

    // + getters and setters
}

Опять не удалось:

ParseErrorRepository.java: 22: ошибка: невозможно реализовать метод репозитория: ParseErrorRepository.listAll ().Свойство [recipe] типа [RecipeDto] несовместимо с эквивалентным свойством, объявленным в сущности: ParseError

Может ли Micronaut Data обрабатывать этот вариант использования посредством проекции DTO?Если нет, то есть ли другой способ, как я могу решить это в Micronaut Data?

1 Ответ

1 голос
/ 30 сентября 2019

Теперь (в последней версии 1.0.0.M1) это невозможно.Таким образом, я создал проблему запроса функции для этого: https://github.com/micronaut-projects/micronaut-data/issues/184

Текущий обходной путь - это сопоставление бина сущности с бином DTO, например, в потоке Java или реактивном потоке, и сопоставление свойств вручную или с помощью Mapstruct.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...