2011-01-10 57 views
0
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类型。我如何在这里进行类型转换。类型不匹配:无法从列表转换为ILogin

回答

2

的问题是不是类型转换本身 - 它是你执行该语句可能返回多个结果的查询,但你只想要一个结果。

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

作为一个稍微分开的问题,您不应该直接在您的查询中包含数据,例如IMO。使用查询参数,这是很容易在休眠:

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是一个实例变量 - 这也许应该是局部变量,按照我上面的例子。

+0

感谢您的帮助,你可以看看这个问题,我现在正在更新http://stackoverflow.com/questions/4646548/error-java-lang-classcastexception – theJava

+0

是的,但在“新”问题你没有改变选择不返回一个列表。而且一个列表不能投给ILogin –

1

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

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

1

我假设春天:)。

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

return results. 

这应该起作用。

相关问题