使用Hibernate进行复杂查询与分页实践

需积分: 0 1 下载量 48 浏览量 更新于2024-08-01 收藏 43KB DOC 举报
"这篇文档主要介绍了Hibernate查询解决方案,作者通过自身的开发体验,分享了使用Hibernate进行数据持久化操作的便捷性,并探讨了在执行复杂查询和分页时的一些实践经验。文档提到了Hibernate提供的查询接口和HQL语句的使用方法,包括根据ID查询以及使用Query接口进行无参数和带参数的查询。" 在开发过程中,作者将原有的Struts应用改造成Struts与Hibernate结合的架构,发现这不仅提升了开发心情,还显著提高了开发效率。随着JDO2.0的即将推出,作者对未来的Java持久层技术发展充满了期待。 在使用Hibernate进行查询时,文档首先介绍了基本的根据ID查询的方法,包括Session接口的`load()`方法的不同形式,这些方法用于根据给定的ID获取对象。 接着,文档重点讨论了HQL(Hibernate Query Language)查询。HQL是Hibernate提供的面向对象的查询语言,它可以更自然地表达对象关系映射的查询。文档列举了如何使用`Query`接口进行无参数和带参数的HQL查询: 1. 不带参数的查询可以通过`createQuery()`创建Query对象,然后执行查询,例如: ```java Query query = session.createQuery("select user from User as user"); ``` 2. 带参数的查询则需要设置参数,有两种方式: - 使用索引设置参数,如: ```java Query query = session.createQuery("select user from User as user where user.name=?"); query.setString(0, name); ``` - 或者使用命名参数,如: ```java Query query = session.createQuery("select user from User as user where user.name=:name"); query.setString("name", name); ``` 此外,文档还提及了Session接口的`find()`方法,这是另一种执行HQL查询的方式,可以接受字符串查询、值数组和类型数组作为参数。 在实际应用中,特别是涉及到复杂的综合查询和分页需求时,这些基础的查询方法往往需要与Criteria API、DetachedCriteria或者Criteria Builder结合使用,以构建更复杂的查询条件和分页逻辑。例如,Criteria API允许开发者以编程方式构建查询,而不需要写HQL字符串,这在某些情况下可能更方便且不易出错。 对于分页查询,通常需要结合`setFirstResult()`和`setMaxResults()`方法来指定查询结果的起始位置和最大条数,实现分页效果。例如: ```java query.setFirstResult(pageNumber * pageSize); query.setMaxResults(pageSize); ``` 这里的pageNumber是当前页码,pageSize是每页显示的记录数。 总结来说,这篇文档提供了一个关于使用Hibernate进行数据查询的基础教程,涵盖了基本的ID查询和HQL查询,对于初学者或正在学习Hibernate的开发者来说,是一份实用的参考资料。然而,对于更高级的查询优化、性能调优以及复杂的关联查询,开发者还需要深入学习Hibernate的更多特性,并结合实际场景进行实践。

Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 org.hibernate.StaleStateException: Batch update returned unexpected row count from update [0]; actual row count: 0; expected: 1 at org.hibernate.jdbc.Expectations$BasicExpectation.checkBatched(Expectations.java:61) at org.hibernate.jdbc.Expectations$BasicExpectation.verifyOutcome(Expectations.java:46) at org.hibernate.jdbc.BatchingBatcher.checkRowCounts(BatchingBatcher.java:68) at org.hibernate.jdbc.BatchingBatcher.doExecuteBatch(BatchingBatcher.java:48) at org.hibernate.jdbc.AbstractBatcher.executeBatch(AbstractBatcher.java:246) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:235) at org.hibernate.engine.ActionQueue.executeActions(ActionQueue.java:140) at org.hibernate.event.def.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:298) at org.hibernate.event.def.DefaultAutoFlushEventListener.onAutoFlush(DefaultAutoFlushEventListener.java:41) at org.hibernate.impl.SessionImpl.autoFlushIfRequired(SessionImpl.java:969) at org.hibernate.impl.SessionImpl.listCustomQuery(SessionImpl.java:1690) at org.hibernate.impl.AbstractSessionImpl.list(AbstractSessionImpl.java:142) at org.hibernate.impl.SQLQueryImpl.list(SQLQueryImpl.java:152) at com.sinosoft.sysframework.persistence.HibernateSQLQuery.doInHibernate(HibernateSQLQuery.java:118) at org.springframework.orm.hibernate3.HibernateTemplate.execute(HibernateTemplate.java:366) at org.springframework.orm.hibernate3.HibernateTemplate.executeFind(HibernateTemplate.java:338) at com.sinosoft.sysframework.persistence.BaseDaoHibernateImpl.queryList(BaseDaoHibernateImpl.java:224) at com.sinosoft.application.reins.persistence.hibernate.base.GrRePlanItemDaoHibernateImplBase.find(GrRePlanItemDaoHibernateImplBase.java:127) at com.sinosoft.application.reins.service.spring.GrTrialServiceSpringImpl.endorTrialDataSurrender(GrTrialServiceSpringImpl.java:9536) at com.sinosoft.application.reins.service.

2023-06-03 上传