Проблема с реактивной проекцией Hibernate DTO

Мы начали проект Quarkus 3 с Hibernate Reactive. Мы попробовали реализацию .project(), но она не работает должным образом. Есть ли какое-либо решение этой проблемы? Можно ли вручную сделать проекцию или что-то в этом роде?

Ошибка:

      java.lang.IllegalStateException: Could not determine appropriate instantiation strategy - no matching constructor found and one or more arguments did not define alias for bean-injection
at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationResultImpl.resolveAssembler(DynamicInstantiationResultImpl.java:197)
at org.hibernate.sql.results.graph.instantiation.internal.DynamicInstantiationResultImpl.createResultAssembler(DynamicInstantiationResultImpl.java:106)

Сущности:

      @Entity
@Table(name = "company")
public class CompanyEntity extends PanacheEntity {
    private String name;
    private String address;

    @OneToMany(mappedBy = "company", targetEntity = DepartmentEntity.class, 
               cascade = CascadeType.ALL, fetch = FetchType.EAGER,
               orphanRemoval = true)
    private List<DepartmentEntity> departments = new ArrayList<>();

    // getters and setters omitted for brevity
}
      @Entity
@Table(name = "department")
public class DepartmentEntity extends PanacheEntity {
    private String name;
    private String description;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.LAZY)
    private CompanyEntity company;

    // getters and setters omitted for brevity
}

DTO

      public class CompanyProjection {
    private String name;
    private List<DepartmentProjection> departments;

    public CompanyProjection(String name, List<DepartmentProjection> departments) {
        this.name = name;
        this.departments = departments;
    }

    // getters and setters omitted for brevity
   
}
      public class DepartmentProjection {
    private String description;

    public DepartmentProjection(String description) {
        this.description = description;
    }

    // getters and setters omitted for brevity
}

Связанный метод репозитория:

      @ApplicationScoped
public class CompanyRepository implements PanacheRepository<CompanyEntity> {

    // ...

    @WithSession
    public Uni<List<CompanyProjection>> getCompanyProjections() {
        return findAll().project(CompanyProjection.class).list();
    }
}

Пример кода доступен на GitHub.

1 ответ

Класс проекции применяется к каждой строке результата запроса. Проблема в том, что конструктор ожидает список. Список обычно подразумевает несколько строк. Вот почему вы видите исключение.

Я не думаю, что Hibernate Reactive или Panache могут автоматически отображать результат ассоциации так, как вам нужно.

Другие вопросы по тегам