Почему аннотация Spring @Query возвращает тип объекта? - PullRequest
0 голосов
/ 22 марта 2019

У меня есть следующий запрос для извлечения определенных столбцов сущности / таблицы из базы данных

@Query("SELECT u.email, u.password FROM User u WHERE email = :email")
Optional<User> getCredentialsByEmail( @Param("email") String email);

Но это дает ClassCastException, и это потому, что запрос возвращает тип Object вместо User.

Принимая во внимание, что, если я выберу все столбцы, как показано ниже:

@Query("SELECT u FROM User u WHERE email = :email")
Optional<User> getCredentialsByEmail( @Param("email") String email);

запрос вернет правильный тип класса, т.е. User.Я не понимаю, почему это различие обеспечивается средой Spring.

Любые предложения, пожалуйста.

Ответы [ 2 ]

0 голосов
/ 22 марта 2019

Если вам требуется только пара столбцов, вы можете использовать Object[] массив объектов

@Query("SELECT u.email, u.password FROM User u WHERE email = :email")
Optional<Object[]> getCredentialsByEmail( @Param("email") String email);

Из позиции 0 вы можете получить email

Из позиции 1 вы можете получить password

Если вы хотите прояснить ситуацию, используйте Interface

public interface Response {

 public String getEmail();

 public String getPAssword();

}

Запрос убедитесь, что имена столбцов и get имена должны совпадать, если вы не можете использовать allies в запросе

@Query("SELECT u.email, u.password FROM User u WHERE email = :email")
Optional<Response> getCredentialsByEmail( @Param("email") String email);
0 голосов
/ 22 марта 2019

Как прокомментировано, ваш первый запрос не возвращает объект User, а Tuple, содержащий выбранные столбцы. Tuple не обязательно привязан к какой-либо конкретной сущности, это просто набор столбцов, возвращаемых вашим запросом.

Есть как минимум следующие варианты, как вы можете справиться с этим:

  • заставить ваш метод репо возвращать объект кортежа
  • создает DTO для выбранных столбцов и создает его с помощью оператора new
  • с оператором new создает конструктор для вашего пользовательского объекта, который принимает выбранные столбцы

Последний вариант будет похож на создание конструктора:

public User(String email, String password ) {
    // set the field values
}

и запрос как:

@Query("SELECT NEW some.package.User(u.email u.password) FROM USER u WHERE email = :email")

Подробнее см. этот вопрос

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...