2014-03-13 58 views
0

我得到一個ClassCastException當迭代列表從HQL類轉換異常在迭代列表中返回從HQL

在該行

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()); 
} 
retured

回答

0

您正在查詢中選擇3件東西查詢:

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

因此,你的查詢將返回一個List<Object[]>,而不是你UserPojo

嘗試這樣的事情,而不是:

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

編輯:

所以,如果你希望你的List<Object[]>成爲List<UserPojo>然後您需要遍歷List<Object[]>並手動分配UserPojo的字段。

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

觀測值:我不會用這樣的,但是這取決於你。

+0

我設法做如下修改代碼'名單用戶列表=(名單)●要獲得相同的HQL的用戶ID。 list();''Object [] obj = userList.get(0);''System.out.println(「userId:」+ obj [0]);'。這裏實體很小,所以加載它不是問題,但在進一步的開發中查詢將變得更長,並且加載整個實體不是一個好的選擇。 – user3157115

+0

我編輯了我的答案。檢查出來 –

+0

是的,這是我想出的第一個解決方案,但是使用MappedPojo'會從所有列中加載數據 (如果我錯了,請糾正我),如果表格包含少量列,那很好。當我們只想獲取少數列(例如從大表)而不是使用'from MappedPojo'時,您可以將sql與選定的列放入過程中,並調用過程將返回'List ',並且它將設置required(not所有,而不是來自MappedPojo')MappedPojo.Pls的屬性正確,並建議我從列數過多的表中提取少量列的替代方法。 – user3157115

0

對於您在select子句中輸入的所有字段,您的查詢必須返回List<Object[]>。我想在你的createQuery僅使用實體名稱應返回List<UserPojo>

"select user1 from UserPojo user1 
    where user1.userName=:userName and user1.password=:password" 
+0

謝謝我明白我在做什麼 – user3157115