类型不匹配:无法从List转换为ILogin

时间:2011-01-10 11:13:40

标签: java hibernate

private ILogin results;

    public ILogin authenticate(Login login) {
        System.out.println(login);
        System.out.println(login.getEmail());
        String query = "SELECT email, id FROM Login WHERE email='"
        + login.getEmail() + "' AND password='" + login.getPassword() + "'";
        results = getHibernateTemplate().find(query);
        System.out.println(results);
        return results;
    }

如何更改results = getHibernateTemplate().find(query);我收到此行中的错误。但我希望ILogin类型不是List类型。我如何在这里进行类型转换。

3 个答案:

答案 0 :(得分:2)

问题不在于类型转换本身 - 您执行的查询可能会返回多个结果,但您只需要单个结果。

您可能想要检查结果列表中是否只有一个值(0表示未找到登录;超过1可能意味着您的数据中存在问题),然后返回第一个值(return (ILogin) list.get(0);)。

作为一个稍微独立的问题,您不应该直接在查询中包含数据,例如IMO。使用查询参数,这在Hibernate中非常简单:

 String query = "SELECT email, id FROM Login WHERE email=? AND password=?";
 Object[] parameters = { login.getEmail(), login.getPassword() };
 List results = getHibernateTemplate().find(query, parameters);
 if (results.size() != 1) {
     // Probably throw an exception
 }
 // I'm assuming your mapping has been set up appropriately such that
 // the returned value will *be* an `ILogin`.
 return (ILogin) results.get(0);

最后,你几乎肯定不希望results成为一个实例变量 - 它应该是一个局部变量,如上面的例子所示。

答案 1 :(得分:1)

虚拟方式是使用getHibernateTemplate().find(query).get(0);,但如果没有找到这样的登录,这将导致异常。

正如乔恩所说,检查你的查询是否空虚。

答案 2 :(得分:1)

我假设春天:)。

List resultsList = getHibernateTemplate().find(query);
if ( resultsList.size() == 1 ) {
results = (ILogin)resultsList.get(0);
} else {
// error no entity or mutiple entities
}

return results.

这应该有用。