Проблема с реактивной проекцией 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 могут автоматически отображать результат ассоциации так, как вам нужно.