2015-01-17 51 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'的字符串。如果他只想得到列表中的Vote對象,OP應該使用'select v from Vote as v left join ...'。 –

+0

@ErwinBolwidt是的,這是我能想出的唯一解釋,如果它是正確的,那麼你的建議顯然是OP應該做的而不是這個解決方法。然而,不是聯接語義,它們只是導致一個急切加載的「消息」字段? Quote:'關聯的對象也不直接返回查詢結果。相反,它們可以通過父對象訪問。「但這適用於* fetch *連接,所以這可能是關鍵的區別。對於這些語義,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 *所做的,只是隱含的。它會失敗,同樣的錯誤。 –

相關問題