我有以下查询,用于从数据库中获取实体/表的特定列
@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框架提供了这种差异。
请提出任何建议。
答案 0 :(得分:0)
如前所述,您的第一个查询不会返回User
对象,而是返回包含所选列的Tuple
。 Tuple
不一定绑定到任何特定实体,而只是查询返回的一组列。
至少有以下几种方法可以解决此问题:
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);