为什么Spring的@Query注释返回Object类型?

时间:2019-03-22 18:07:41

标签: spring-boot spring-data-jpa

我有以下查询,用于从数据库中获取实体/表的特定列

@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 :(得分:0)

如前所述,您的第一个查询不会返回User对象,而是返回包含所选列的TupleTuple不一定绑定到任何特定实体,而只是查询返回的一组列。

至少有以下几种方法可以解决此问题:

  • 使您的repo方法返回一个元组对象
  • 为所选列创建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")

有关更多详细信息,请参见this question

答案 1 :(得分:0)

如果只需要几列,则可以使用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);