Я могу иметь такую проекцию интерфейса:
public interface Person {
String getFirstName();
String getLastName();
}
И я могу иметь запрос JPQL в JpaRepository
вот так:
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Query("select e.firstName as firstName, e.lastName as lastName from Employee e")
List<Person> fetchEmployeeNames();
}
Эквивалент проекции класса будет выглядеть вот так:
public class Person {
private String firstName;
private String lastName;
public Person(String firstName, String lastName) {
this.firstName = firstName;
this.lastName = lastName;
}
// getters and setters
}
С использованием конструктора JPQL следующим образом:
public interface EmployeeRepository extends JpaRepository<Employee, Long> {
@Query("select new my.package.Person(e.firstName, e.lastName) from Employee e")
List<Person> fetchEmployeeNames();
}
Использование запроса проекции интерфейса с проекцией класса приведет к этому исключению:
org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [org.springframework.data.jpa.repository.query.AbstractJpaQuery$TupleConverter$TupleBackedMap] to type [my.package.Person]
Почему я не могу использовать проекцию класса без указания конструктора, точно так же, как интерфейс JPQL? Есть ли способ разрешить проекцию класса без указания конструктора? Могу ли я создать общий c конвертер для преобразования в любую проекцию класса?