2011-01-10 9 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

問題は、それ自体は型変換ではありません - それはあなたが複数結果を返すことがあり、クエリを実行してきたことですが、あなただけの単一結果が欲しいです。

結果リストに正確に1つの値(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);を使用するのがダミーですが、このようなログインが見つからない場合は例外となります。

Jonが言ったように、空の有無を確認してください。

1

私は春と思います:)。

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

return results. 

これは動作するはずです。

関連する問題