2016-03-05 94 views
1

我想獲得一些特定的列使用休眠,但這個查詢總是失敗。春季休眠獲取選定的列

@Override 
public Users findByEmail(String emailID) { 
    // TODO Auto-generated method stub 
    try{ 

     List<Users> users = new ArrayList<Users>(); 

     users = this.sessionFactory.getCurrentSession().createQuery("SELECT userID, firstName, lastName, imageURL, password, emailID, enabled FROM Users WHERE emailID = :email_ID") 
       .setParameter("email_ID", emailID).list(); 

     if(users.size() > 0) 
      return (Users)users.get(0); 
     else 
      return null; 
    } 
    catch(Exception exc) 
    { 
     log.error(exc.getMessage()); 
     return null; 
    } 
} 

這個查詢總是失敗,所以我用下面的查詢

@Override 
public Users findByEmail(String emailID) { 
    // TODO Auto-generated method stub 
    try{ 

     List<Users> users = new ArrayList<Users>(); 

     users = this.sessionFactory.getCurrentSession().createQuery("FROM Users WHERE emailID = :email_ID") 
       .setParameter("email_ID", emailID).list(); 

     if(users.size() > 0) 
      return (Users)users.get(0); 
     else 
      return null; 
    } 
    catch(Exception exc) 
    { 
     log.error(exc.getMessage()); 
     return null; 
    } 
} 

我怎樣才能使用Hibernate只有特定的列,而不是讓列的20多歲?

回答

1

每當你會選擇多列的查詢將返回List<Object[]>

List<Object[]> rows = this.sessionFactory.getCurrentSession() 
        .createQuery("SELECT userID, firstName, lastName, 
         imageURL, password,emailID, enabled 
         FROM Users WHERE emailID = :email_ID") 
         .setParameter("email_ID", emailID).list(); 

現在迭代

(Object[] row: rows) { 
    System.out.println(" ------------------- "); 
    System.out.println("userid: " + row[0]); 
    System.out.println("firstName: " + row[1]); 
    User u=new User(); 
    u.setUserId(row[0]); 
    u.setFirstName(row[1]); 
    u.setLastName(row[2]); 

} 

,並同其他行

Reference

+0

但我想返回'用戶'對象,因爲我使用彈簧安全性進行登錄認證。 –

+0

如果你想'User'對象不應該期望得到所有與它相關的列? –

+0

@HarshitShrivastava請看更新的答案 – xrcwrn

2

你可以嘗試使用結果變換器

List<User> users = session 
.createQuery(
"SELECT userID as userID, firstName as firstName FROM Users WHERE emailID = :email_ID") 
.setParameter("email_ID", emailID) 
.setResultTransformer(new AliasToBeanResultTransformer(User.class)).list(); 

您需要指定投影別名:firstName as firstName,但您可以嘗試不使用它。