繁体   English   中英

休眠条件列表迭代

[英]Hibernate criteria list iterating

我要使用以下代码部分返回对象的集合:

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能够按预期工作,所以我更喜欢前一种方法。 有人有什么想法吗?

首先,我正在使用Hibernate 3.5.4 final,Hibernate-validator 4.2.0 Final,hibernate-search 3.4.0 Final和hibername-c3p0 3.6.5 final,它们均来自maven仓库。

根据注释进行编辑以澄清。

根据问题中的描述,两个代码段应返回相同的结果。 假设在第一个代码段中,Hibernate执行与在第二个段中相同的查询(您可以在日志中检查它,只需启用“ hibernate.show_sql”配置参数即可)-问题在于将结果集转换为MyObj列表。 由于休眠中的错误,这种情况不太可能发生,因此可能是由于不正确的实体类映射所致。 如果看不到映射问题,请向该问题添加更多详细信息(您的具有映射的实体类,数据库表模式和数据示例),以便任何人都可以重现该问题。

您的MyObj类可能没有正确定义的ID列映射。 例如,如果映射为Id的字段/属性对于结果列表中的所有对象都具有相同的值,则hibernate将返回相同的对象(与您的情况相同)。 关于使用基元作为ID类型:休眠允许使用基元类型,但是在文档中包含以下内容:

我们建议您在持久性类上声明以统一名称命名的标识符属性,并使用可为空(即非原始)类型。

总结可能的ID映射问题:1. ID映射列在db中不是唯一的。 2.未指定对应的ID属性getter映射的setter,或者未真正保存传递的参数值。 3. ID字段的类型不能为空。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM