Hibernate 迭代从HQL返回的列表时发生类强制转换异常

Hibernate 迭代从HQL返回的列表时发生类强制转换异常,hibernate,hql,Hibernate,Hql,当迭代从HQL返回的列表时,我得到一个ClassCastException 在这条线上 userpojou=(UserPojo)userList.get(0) UserDao.java public class UserDao { Session session = null; Transaction tx=null; public int validateUser(UserManagedBean user) { int validateFlag=-1;

当迭代从HQL返回的列表时,我得到一个ClassCastException

在这条线上

userpojou=(UserPojo)userList.get(0)

UserDao.java

public class UserDao
{
   Session session = null;
   Transaction tx=null;
   public int validateUser(UserManagedBean user)
   {
    int validateFlag=-1;
    try
    {
        tx = session.beginTransaction();
        Query q = session.createQuery("select user1.userId, user1.userName, user1.password from UserPojo user1 where user1.userName=:userName and user1.password=:password");
        //Query q=session.getNamedQuery("validateUser");
        //Query q=session.getNamedQuery("proc_validateUser");
        q.setParameter("userName", user.getUserName());
        q.setParameter("password", user.getPassword());
        List<UserPojo> userList = q.list();
        //List<UserPojo> userList = (List<UserPojo>)q.list();
        int rowCount = userList.size();
        if (rowCount == 1)
        {
            UserPojo u=(UserPojo)userList.get(0);
            System.out.println("U.userId:"+u.getUserId());
            //user.setUserId(userList.get(0).getUserId());

            validateFlag = 1;
        }
        else if (rowCount == 0)
        {
            validateFlag = 0;
        }
        else if (rowCount > 1)
        {
            validateFlag = -1;
        }
        tx.commit();
    }
    catch (HibernateException e)
    {
        LOG.logp(Level.SEVERE, "UserDao", "validateUser", "Caught HibernateException During User Validity Check", e);
        try
        {
            tx.rollback();
        }
        catch(HibernateException ex)
        {
            LOG.logp(Level.SEVERE, "UserDao", "validateUser", "Caught HibernateException While Rolling Back Transaction", ex);
        }
    }
    return validateFlag;
 }
 public UserDao()
 {
     session = HibernateUtil.getSessionFactory().getCurrentSession();
 }
 private static final Logger LOG = Logger.getLogger(UserDao.class.getName());
}
公共类UserDao
{
会话=空;
事务tx=null;
public int validateUser(UserManagedBean用户)
{
int validateFlag=-1;
尝试
{
tx=session.beginTransaction();
Query q=session.createQuery(“从UserPojo user1中选择user1.userId、user1.userName、user1.password,其中user1.userName=:userName和user1.password=:password”);
//Query q=session.getNamedQuery(“validateUser”);
//Query q=session.getNamedQuery(“proc_validateUser”);
q、 setParameter(“userName”,user.getUserName());
q、 setParameter(“password”,user.getPassword());
List userList=q.List();
//List userList=(List)q.List();
int rowCount=userList.size();
如果(行计数==1)
{
UserPojo u=(UserPojo)userList.get(0);
System.out.println(“U.userId:+U.getUserId());
//user.setUserId(userList.get(0.getUserId());
validateFlag=1;
}
else if(rowCount==0)
{
validateFlag=0;
}
否则如果(行计数>1)
{
validateFlag=-1;
}
tx.commit();
}
捕获(休眠异常e)
{
logp(Level.SEVERE,“UserDao”,“validateUser”,“在用户有效性检查期间捕获HibernateException”,e);
尝试
{
tx.回滚();
}
捕获(HibernateeException例外)
{
logp(Level.SEVERE,“UserDao”,“validateUser”,“回滚事务时捕获到HibernateException”,ex);
}
}
返回验证滞后;
}
公共用户dao()
{
session=HibernateUtil.getSessionFactory().getCurrentSession();
}
私有静态最终记录器LOG=Logger.getLogger(UserDao.class.getName());
}

您在查询中选择了3项内容:

select user1.userId, user1.userName, user1.password...
因此,您的查询将返回一个
列表
,而不是您的
UserPojo

请尝试以下方法:

select user1  from UserPojo user1 where user1.userName=:userName and
user1.password=:password
编辑:

因此,如果您希望您的
列表
成为
列表
,那么您需要迭代您的
列表
,并手动分配UserPojo的字段

(对象[]对象:列表)的
{
UserPojo UserPojo=。。。
setUserId(obj[0]);
...
}


Obs:我不会那样使用它,但这取决于你。

你的查询必须返回一个
列表,列出你在
select
子句中输入的所有字段。我认为在
createQuery
中仅使用实体名称应该返回一个
列表


通过对代码
List userList=(List)q.List()进行以下更改,我成功地获得了具有相同hql的用户id
Object[]obj=userList.get(0)`System.out.println(“用户标识:+obj[0]);`。这里的实体很小,所以加载整个实体不是问题,但在进一步的开发中,查询将变得更长,加载整个实体不是一个好的选择。是的,这是我想出的第一个解决方案,但使用MappedPojo中的
将加载所有列中的数据(如果我错了,请纠正我),若表中包含的列很少,那个么就可以了。当我们只想获取少数列(例如从大表中获取)而不是使用MappedPojo中的
时,您可以将包含选定列的sql放入过程中,调用该过程将返回
List
,并且它将设置为required(不是全部,而不是MappedPojo中的
)MappedPojo的属性。请更正并建议我从列太多的表中获取少数列的其他方法。我在这个链接中找到了一个答案:我想你需要/想要的是用户“baba”回答的内容。谢谢,我只是在寻找Hanks我明白我在做什么
"select user1 from UserPojo user1 
    where user1.userName=:userName and user1.password=:password"