2016-03-05 4 views
1

Я пытаюсь получить некоторые конкретные столбцы, используя спящий режим, но этот запрос всегда терпит неудачу.Spring Hibernate получить выбранные столбцы

@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; 
    } 
} 

Как я могу получить только определенные столбцы, используя спящий режим, а не получать 20s колонн?

ответ

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

Но я хочу вернуть объект 'users', так как я использую его для аутентификации входа с использованием весенней безопасности. –

+0

Если вы хотите, чтобы объект 'User' не ожидал получить все связанные с ним столбцы? –

+0

@ ХаршитШривастава, пожалуйста, см. Обновленный ответ – 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, но вы можете попробовать без него.