java.lang.ClassCastException:org.hibernate.internal.QueryImpl不能强制转换为com.models.User

java.lang.ClassCastException:org.hibernate.internal.QueryImpl不能强制转换为com.models.User,java,hibernate,hql,Java,Hibernate,Hql,我有一个这样构造的用户表 id name email 1 cc cc@yahoo.com 2 rr rr@yahoo.com 3 cc cc@yahoo.com 我正在编写一个查询来保存日志,当它发现一封电子邮件与下面的hql匹配时 String hql = "FROM User c WHERE c.email = :email order by c.id"; return (User) _session

我有一个这样构造的用户表

id    name     email
1     cc       cc@yahoo.com
2     rr       rr@yahoo.com
3     cc       cc@yahoo.com
我正在编写一个查询来保存日志,当它发现一封电子邮件与下面的hql匹配时

String hql = "FROM User c WHERE c.email = :email order by c.id";
        return (User) _sessionFactory.getCurrentSession().createQuery(hql).setParameter("email", email);
当我运行我的代码时,我得到了这个错误

java.lang.ClassCastException: org.hibernate.internal.QueryImpl cannot be cast to com.models.User
    at com.models.UserDao.getByEmail(UserDao.java:62)
您忘记调用以获取第一个结果,代码应该是:

 return (User) _sessionFactory.getCurrentSession().createQuery(hql)
    .setParameter("email", email)
    .uniqueResult();
实际上,您之所以会出现此错误,是因为您试图将
查询
实例强制转换为
用户
,而这是无法完成的,您需要先执行查询以获取
用户
实例


如果你想得到几个结果,然后考虑使用,那么代码将是类似的:

 return (List<User>) _sessionFactory.getCurrentSession().createQuery(hql)
    .setParameter("email", email)
    .list();
return(List)\u sessionFactory.getCurrentSession().createQuery(hql)
.setParameter(“电子邮件”,电子邮件)
.list();

最后似乎忘记调用
getResultList()
方法

return (List<User>) _sessionFactory.getCurrentSession().createQuery(hql)
              .setParameter("email", email)
              .getResultList();
return(List)\u sessionFactory.getCurrentSession().createQuery(hql)
.setParameter(“电子邮件”,电子邮件)
.getResultList();

您应该注意到,由于您期望的结果不止一个,因此需要稍微更改此命令或使代码适应返回的位置。

您必须从查询中提取结果。可以通过使用提取单个对象

.createQuery(hql).getSingleResult();

你期待一个结果吗?或者多个?多个结果似乎您缺少命令结尾处的
.getResultList()
。@Francis因此将其强制转换为用户对象没有任何意义,因为结果将为您提供其他内容,您需要获得第一个结果,然后将其强制转换为用户。如果我想获得第三行呢,这就是为什么我问他是否需要一个或多个结果@尼古拉斯·菲洛托