2015-03-13 68 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

相关问题