几年后我回到Java,这是我第二天看hibernate并且还没有完全理解它。
我有以下标准执行连接:
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 :(得分:2)
在Criteria API中,尝试获取结果时,异常总是(?)抛出。
在您的情况下,有问题的行可能是
cr.add(Restrictions.in("bla.blaName", (List<Bla>) getBlas()));
您似乎要检查java.lang.String
是否属于Collection<Bla>
。
如果equals
中的hashcode
和Bla
方法使用blaName
字段,您应该可以使用
cr.add(Restrictions.in("bla", (List<Bla>) getBlas()));
否则,实现一个返回getBlasNames()
List<String>
函数