2013-11-19 4 views
0

Я написал этот код, чтобы привести объект итератора к заранее определенному объекту, но это не удается, и это поднять исключение в классе ролей:Не могу бросить итератор объекта

public ArrayList<Session> getAllSessions() { 

    ArrayList<Session> sessions = new ArrayList<Session>(); 
    Query sessionsQuery = null; 
    sessionsQuery = this.getSession().getNamedQuery("getAllSessions"); 
    Iterator trainees = sessionsQuery.list().iterator(); 

    while (trainees.hasNext()) { 
     sessions.add((Session) trainees.next()); 
    } 
    return sessions; 

} 


java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Session 

Запрос:

<sql-query name="getAllSessions"><![CDATA[ select ss.ID,ss.NAME from SESSION_ ss where ss.ISDELETED<>1]]></sql-query> 

что такой проблема здесь?

+3

Показать свой именованный запрос –

+3

Вы комментировали свой класс сущности 'Session'? используя ['SqlResultSetMapping'] (http://docs.oracle.com/javaee/5/api/javax/persistence/SqlResultSetMapping.html)? –

ответ

0

Лучшее решение для вашей проблемы и, возможно, уменьшит ваш код

return sessionsQuery.list(); 

В вышеуказанной проблемы вы итерацию список, используя итератор и снова хранить в ArrayList unnecesarry создания объекта

Вместо возвращает этот список что вы получаете от кода выше.

Осмотрев свое имя запроса, я узнал, что это даст вам

List<Object[]> 

, потому что вы прошли прогнозы выбора оператора

Вместо этого вы можете сделать запрос в

 Select sess from SESSION sess where 'your condition what you want' 
0

Если вы посмотрите на документы Query#list() (выделение мое)

Возвращает результаты запроса в виде списка. Если запрос содержит несколько предварительных строк результатов, результаты возвращаются в экземпляре Объект [].

Он возвращает список Object[], где каждый Object[] представляет собой строку и при попытке бросить эту Object[] как Session, вы получите ошибку,

java.lang.ClassCastException: [Ljava.lang.Object; cannot be cast to Session 
0

Ваш запрос не возвращает List<Session>, но List<Object[]>, так как он запрашивает два атрибута (ID и NAME).

Вы не должны использовать SQL, а HQL. И ваш запрос должен быть

select s from Session s where s.deleted = false 

(предполагается, что ваш объект имеет deleted поля логического типа).

Вы также должны переименовать свою сущность в нечто иное, чем Session, поскольку оно конфликтует с типом сеанса Hibernate.

Смежные вопросы