2015-01-17 3 views
2

Я пытаюсь получить все голоса пользователя для сообщений в пользовательском вопросе:java.lang.Object не может быть брошен

List<Vote> list = sessionFactory.getCurrentSession() 
     .createQuery("from Vote as v left join v.message as m " + 
       "where m.question=:question and v.user=:user and v.voteType=:voteType") 
     .setParameter("question", question) 
     .setParameter("user", user) 
     .setParameter("voteType", VoteType.MESSAGE) 
     .list(); 
System.out.println(list.get(0).getMessage().getNumber()); 

И получил исключение в последней строке:

java.lang .ClassCastException: [Ljava.lang.Object; не может быть приведен к ru.kapahgaiii.qa.domain.Vote ru.kapahgaiii.qa.repository.ChatDAOImpl.getVotes (ChatDAOImpl.java:114)

Что я делаю неправильно?

Vote.java:

@Entity 
@Table(name = "votes") 
public class Vote { 

    @Id 
    @GeneratedValue 
    @Column(name = "vote_id") 
    private Integer voteId; 

    @ManyToOne 
    @JoinColumn(name = "uid") 
    private User user; 

    @Column(name = "vote_type", length = 8) 
    @Enumerated(EnumType.STRING) 
    private VoteType voteType; 

    @ManyToOne 
    @JoinColumn(name = "message_id") 
    private Message message; 
+0

Можете ли вы проверить с помощью отладчика, если 'list' действительно содержит объекты' Vote'? –

ответ

3

Вы делаете неправильный бросок. Hibernate возвращает вам все объекты из запроса по вашему запросу. Но вам нужно использовать Vote объект, который по индексу 0.

List<Object[]> list = sessionFactory.getCurrentSession() 
     .createQuery("from Vote as v left join v.message as m " + 
       "where m.question=:question and v.user=:user and v.voteType=:voteType") 
     .setParameter("question", question) 
     .setParameter("user", user) 
     .setParameter("voteType", VoteType.MESSAGE) 
     .list(); 
System.out.println(list.get(0)[0].getMessage().getNumber()); 
+0

OP, по крайней мере, было бы интересно узнать, какой объект находится в индексе 1. В вашем запросе четко указывается только один элемент на строку, поэтому я предполагаю, что вы не отправили реальный запрос, который вы выполняете. –

+0

@MarkoTopolnik Это, вероятно, строка, содержащая 'v.message'. OP должен использовать 'select v from Vote as v left join ...', если он просто хочет получить объекты Vote в списке. –

+0

@ErwinBolwidt Да, это единственное объяснение, которое я мог придумать, и если это правильно, то ваше предложение явно должно сделать OP вместо этого обходного пути. Однако не являются ли семантики соединений такими, что они просто приводят к загруженному полю 'message'? Цитата: 'Связанные объекты также не возвращаются непосредственно в результатах запроса. Вместо этого к ним можно получить доступ через родительский объект. «Но это относится к * fetch * join, поэтому это может быть ключевым отличием. Документы Hibernate, как правило, довольно туманны в отношении этой семантики, часто она требует пробной ошибки, чтобы угадать их. –

-1

Попробуйте сделать это следующим образом:

List<Object> list = sessionFactory.getCurrentSession() 
      .createQuery("from Vote as v left join v.message as m " + 
        "where m.question=:question and v.user=:user and v.voteType=:voteType") 
      .setParameter("question", question) 
      .setParameter("user", user) 
      .setParameter("voteType", VoteType.MESSAGE) 
      .list(); 
    System.out.println(((Vote) list.get(0)).getMessage().getNumber()) 

;

+1

Это то, что OP * делает, только неявно. Он будет терпеть неудачу с той же ошибкой. –

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