2016-03-05 124 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,但您可以尝试不使用它。