Проекция класса Spring Data JPA без конструктора - PullRequest
1 голос
/ 03 августа 2020

Я могу иметь такую ​​проекцию интерфейса:

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 конвертер для преобразования в любую проекцию класса?

1 Ответ

0 голосов
/ 04 августа 2020

То, что вы пытаетесь, невозможно. Если вам нужны специальные условия WHERE, вы можете реализовать это, используя метод findAll(Specification<Employee> s) через методы по умолчанию в интерфейсах.

...