Hibernate标准列表迭代

时间:2011-07-24 21:03:41

标签: java hibernate collections iterator

我有以下代码部分,我想用它来返回我的对象​​的集合:

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。

根据评论编辑澄清。

1 个答案:

答案 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字段。