2015-03-13 65 views
1

幾年後,我又回到了Java,這是我第二天在看待hibernate並且還沒有完全理解它。Hibernate Criteria.list()導致java.lang.ClassCastException

我有以下標準正在執行聯接:

Criteria cr = s.createCriteria(Bla.class, "bla"); 
cr.setFetchMode("bla.nodePair", FetchMode.JOIN); 
cr.createAlias("bla.nodePair", "node_pair"); 
cr.add(Restrictions.in("bla.blaName", (List<Bla>) getBlas())); 

ProjectionList columns = Projections.projectionList() 
    .add(Projections.property("node_pair.priNode")) 
    .add(Projections.property("bla.blaName")) 
    .add(Projections.property("node_pair.secNode")) 
    .add(Projections.property("bla.port")); 

cr.setProjection(columns); 
List<Object[]> list = cr.list(); // Exception occurs here 

這是就建立我可以告訴一個有效的SQL查詢,正是我後我。

然而,當我嘗試生成結果列表cr.list();我得到:

java.lang.ClassCastException: com.some.package.domainobject.Bla cannot be cast to java.lang.String 

我應該如何構建我的列表。任何指針非常讚賞。

+0

你舉的例子好像它是完全的東西你彌補了練習。數據庫中的東西實際上是類「Bla」類嗎?你把它放在那裏?你可能試圖從數據庫中讀取一個不同的對象,這會讓你失望。 – markspace 2015-03-13 15:33:22

回答

2

在Criteria API中,嘗試獲取結果時,Exception總是(?)拋出。

在你的情況,有問題的線可能是

cr.add(Restrictions.in("bla.blaName", (List<Bla>) getBlas())); 

你似乎來檢查java.lang.StringCollection<Bla>的一部分。

如果您equalshashcode方法Bla使用blaName場,你應該能夠使用

cr.add(Restrictions.in("bla", (List<Bla>) getBlas())); 

否則,實現了getBlasNames()函數返回一個List<String>

+0

如果我註釋掉'List list = cr.list();'那麼不會拋出異常,所以我不相信'cr.add(Restrictions.in(「bla.blaName」,(List )getBlas() ));'是問題:/ – HGPB 2015-03-13 15:28:18

+1

在嘗試獲取結果列表之前,沒有生成SQL。這就是當你調用cr.list();時發生的情況。 – cghislai 2015-03-13 15:33:58

+0

你說得很對。不確定你在談論關於'equals'和'hashcode'方法?你能給個例子嗎 ? – HGPB 2015-03-13 15:57:31

相關問題