2016-08-08 52 views
0

Ich habe eine Benutzertabelle auf diese Weisejava.lang.ClassCastException: org.hibernate.internal.QueryImpl kann nicht auf com.models.User gegossen werden

id name  email 
1  cc  [email protected] 
2  rr  [email protected] 
3  cc  [email protected] 

strukturiert ich eine Abfrage schreibe ein Protokoll zu speichern, wenn immer findet es eine E-Mail eine der Zeile mit dem unten hql passenden

String hql = "FROM User c WHERE c.email = :email order by c.id"; 
     return (User) _sessionFactory.getCurrentSession().createQuery(hql).setParameter("email", email); 

Wenn ich meinen Code ausführen ich diesen Fehler

java.lang.ClassCastException: org.hibernate.internal.QueryImpl cannot be cast to com.models.User 
    at com.models.UserDao.getByEmail(UserDao.java:62) 
+0

Erwarten Sie ein Ergebnis? Oder mehr als einer? – Julian

+0

mehr als ein Ergebnis – Francis

+0

Es scheint, dass Sie die '.getResultList()' am Ende Ihres Befehls fehlt. – Julian

Antwort

1

Y erhalten ou vergessen uniqueResult() zu nennen das erste Ergebnis zu erhalten, sollte der Code eher sein:

return (User) _sessionFactory.getCurrentSession().createQuery(hql) 
    .setParameter("email", email) 
    .uniqueResult(); 

Tat Sie diesen Fehler erhalten, weil Sie versuchen, eine Query Instanz in eine User zu werfen, die getan werden kann nicht, müssen Sie das ausführen Abfrage zuerst, um Ihre User Instanz zu erhalten.


Wenn Sie mehrere Ergebnisse betrachten bekommen dann list() verwenden, wird der Code dann so etwas wie:

return (List<User>) _sessionFactory.getCurrentSession().createQuery(hql) 
    .setParameter("email", email) 
    .list(); 
+0

was ist, wenn ich die dritte Zeile bekommen möchte – Francis

+0

Ja, deshalb fragte ich, ob er ein oder mehr als ein Ergebnis benötigt. @NicolasFilotto – Julian

+0

okay danke dann – Francis

0

Es scheint, dass Sie die getResultList() Methode am Ende zu nennen vergessen.

return (List<User>) _sessionFactory.getCurrentSession().createQuery(hql) 
       .setParameter("email", email) 
       .getResultList(); 

Sie sollten feststellen, dass da Sie mehr als ein Ergebnis erwarten, werden Sie ein bisschen diesen Befehl ändern müssen oder den Code anzupassen, wo dies zurückkehrt.