Возврат одной проекции из собственного запроса - PullRequest
0 голосов
/ 16 апреля 2020

Я пытаюсь вернуть прогноз, а не список прогнозов, из собственного запроса. Я продолжаю сталкиваться с ошибкой конвертера:

org.springframework.core.convert.ConverterNotFoundException: No converter found capable of converting from type [java.lang.String] to type [PersonRepository$NameProjection]

Моя весенняя версия довольно старая (spring-boot-starter-data-jpa v1.5.3), но я не могу обновить ее по внешним причинам. Поэтому мне просто интересно, смогу ли я заставить его работать с версией, которую я имею.

Мой репозиторий выглядит так:

public PersonRepository extends JpaRepository<Person, Integer> {

    interface NameProjection {
        private String firstName;
        private String lastName;
    }

    @Query(value = "SELECT first_name AS firstName, last_name AS lastName FROM person where person_id = :personId", nativeQuery = true)
    NameProjection getPersonNameById(@Param("personId") Integer personId);

    @Query(value = "SELECT first_name AS firstName, last_name AS lastName FROM person", nativeQuery = true)
    List<NameProjection> getPersonNames();
}

Когда я вызываю getPersonNameById(), я получаю ошибку выше , Что интересно, этот метод работает, если я изменю свою проекцию так, чтобы в ней было только 1 поле, скажем, firstName. Однако всякий раз, когда имеется более одного поля, я получаю ошибку конвертера выше.

Вызов getPersonNames() работает точно так, как я ожидаю, когда список проекций возвращается с полями, которые я указал.

Как я могу изменить свой код репозитория, чтобы Spring позволил мне возвращать одну проекцию?

Заранее спасибо.

1 Ответ

0 голосов
/ 16 апреля 2020

Это может быть длинная исправленная ошибка: https://jira.spring.io/browse/DATAJPA-980 или некоторая связанная с этим проблема, в этой области их было несколько.

Если вам случится использовать EclipseLink, с этим еще есть проблемы: https://bugs.eclipse.org/bugs/show_bug.cgi?id=525319

Так что реальное решение проблемы - обновить ваши версии.

Если это невозможно, как вы описываете в своем вопросе, возможно, лучшая идея - переключиться на пользовательскую реализацию и работать непосредственно с EntityManager или даже просто с Jdb c Connection / JdbcTemplate.

...