Question

I am getting a ClassCastException when iterating a list retured from HQL

at this line

UserPojo u=(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());
}
Was it helpful?

Solution

You are selecting 3 things in you query:

select user1.userId, user1.userName, user1.password...

Thus your query will return a List<Object[]> and not your UserPojo

Try something like this instead:

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

EDIT:

So if you want your List<Object[]> to become a List<UserPojo> then you need to iterate through your List<Object[]> and assign UserPojo's fields manually.

for(Object[] obj : list) { UserPojo userPojo = ... userPojo.setUserId(obj[0]); ... }

Obs: I wouldn't use it like that, but that's up to you.

OTHER TIPS

Your query must be returning a List<Object[]> for all the fields you put in the select clause. I think using only the entity name in your createQuery should return a List<UserPojo>:

"select user1 from UserPojo user1 
    where user1.userName=:userName and user1.password=:password"
Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top