我有以下代码部分,我想用它来返回我的对象的集合:
Session session = HibernateUtil.getSession();
List<MyObj> myObjList = (List<MyObj>)
session.createCriteria(MyObj.class)
.add(Restrictions.eq("searchField", searchField)).list();
Iterator<MyObj> myObjIt = myObjList.listIterator();
log.debug("list size: " + myObjList.size());
while(myObjIt.hasNext()){
MyObj myObj = myObjIt.next();
log.debug(myObj.getMyField());
}
但是,我的日志会保持打印与列表大小相同的记录数。如果我稍微重构,我的代码就像这样正常工作:
SQLQuery query = session.createSQLQuery(
"select my_field from my_table where search_field = :searchField"
);
query.setParameter("myField", myField);
List result = query.list();
for(Iterator iter = result.iterator(); iter.hasNext();){
Object[] row = (Object[]) iter.next();
log.debug(row[0]);
}
我在第一段代码中做错了什么?无论哪种方式我都应该这样做,因为我正在使用Hibernate,我宁愿ORM按预期工作,所以我更喜欢前一种方法而不是后者。有人有什么想法吗?
Fwiw,我正在使用Hibernate 3.5.4 final,Hibernate-validator 4.2.0 Final,hibernate-search 3.4.0 Final,以及hibername-c3p0 3.6.5 final,全部来自maven repos。
根据评论编辑澄清。
答案 0 :(得分:1)
根据您在问题中描述的内容,您的两个代码段应返回相同的结果。假设在第一个代码段中,Hibernate执行与第二个段中相同的查询(您可以在日志中检查它,只需启用'hibernate.show_sql'配置参数) - 问题在于将结果集转换为MyObj列表。由于hibernate中的错误,它不太可能发生,因此可能是由于不正确的实体类映射。如果您没有看到映射方面的任何问题,请在问题中添加更多详细信息(您的实体类包含映射,db表架构和数据示例),以便任何人都可以重现该问题。
可能你的MyObj类没有正确定义Id列映射。例如,如果映射为Id的字段/属性对结果列表中的所有对象具有相同的值,则hibernate将返回相同的对象(如您的情况)。 关于使用基元作为Id类型:hibernate允许使用基元类型,但它在文档中有以下行:
我们建议您在持久化类上声明一致命名的标识符属性,并使用可空(即非原始)类型。
总结可能的Id映射问题: 1. Id映射列在db中不是唯一的。 2.没有指定Id属性getter映射的相应setter,或者没有真正保存传递的参数值。 3.不可空类型的Id字段。