HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。这种灵活方式主要是通过如下两个方法完成的:
(1)
- Objectexecute(HibernateCallbackaction)
- Objectexecute(HibernateCallbackaction)
(2)
- ListexecuteFind(HibernateCallbackaction)
- ListexecuteFind(HibernateCallbackaction)
HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallBack,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。
HibernateCallback是个接口,该接口包含一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。
注意:
在doInHibernate方法内可访问Session,该Session对象是绑定到该线程的Session实例。在该方法内的持久层操作,与不使用Spring时的持久化操作完全相同。这保证了对于复杂的持久化层访问,依然可以使用Hibernate的访问方式。
下面是有一个HibernateDaoSupport扩展类(增加了三个分页查询的方法):
- //==============================================
- publicclassExtendHibernateDaoSupportextendsHibernateDaoSupport{
- /**
- 使用hql进行分页查询
- @paramhql需要查询的hql语句
- @paramoffset第一条记录索引
- @parampageSize当前需要显示的记录数
- @return当前页的所有记录*/
- publicListfindByPage(finalStringhql,finalintoffset,finalintpageSize){
- //通过一个HibernateCallback对象来执行查询
- Listlist=getHibernateTemplate().executeFind(
- newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
- publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
- Listresult=session.createQuery(hql)
- .setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
- returnresult;
- }
- });
- returnlist;
- }
- /**
- 使用hql进行分页查询
- @paramhql需要查询的hql语句
- @paramvalue如果hql有一个参数需要传入,value就是传入hql语句的参数
- @paramoffset第一条记录索引
- @parampageSize当前需要显示的记录数
- @return当前页的所有记录
- */
- publicListfindByPage(finalStringhql,finalObjectvalue,finalintoffset,finalintpageSize){
- //通过一个HibernateCallback对象来执行查询
- Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
- publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
- Listresult=session.createQuery(hql)//为hql语句传入参数
- .setParameter(0,value)
- .setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
- returnresult;
- }
- });
- returnlist;
- }
- /**
- 使用hql进行分页查询
- @paramhql需要查询的hql语句
- @paramvalues如果hql有多个参数需要传入,values就是传入hql语句的参数数组
- @paramoffset第一条记录索引
- @parampageSize当前需要显示的记录数
- @return当前页的所有记录
- */
- publicListfindByPage(finalStringhql,finalObject[]values,finalintoffset,finalintpageSize){
- //通过一个HibernateCallback对象来执行查询
- Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){
- //实现HibernateCallback接口必须实现的方法
- publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{
- //执行Hibernate分页查询
- Queryquery=session.createQuery(hql);
- //为hql语句传入参数
- for(inti=0;i<values.length;i++){
- query.setParamter(i,values[i]);
- }
- Listresult=query.setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
- returnresult;
- }
- });
- returnlist;
- }
- //==============================================
- publicclassExtendHibernateDaoSupportextendsHibernateDaoSupport{
- /**
- 使用hql进行分页查询
- @paramhql需要查询的hql语句
- @paramoffset第一条记录索引
- @parampageSize当前需要显示的记录数
- @return当前页的所有记录*/
- publicListfindByPage(finalStringhql,finalintoffset,finalintpageSize){
- //通过一个HibernateCallback对象来执行查询
- Listlist=getHibernateTemplate().executeFind(
- newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
- publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
- Listresult=session.createQuery(hql)
- .setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
- returnresult;
- }
- });
- returnlist;
- }
- /**
- 使用hql进行分页查询
- @paramhql需要查询的hql语句
- @paramvalue如果hql有一个参数需要传入,value就是传入hql语句的参数
- @paramoffset第一条记录索引
- @parampageSize当前需要显示的记录数
- @return当前页的所有记录
- */
- publicListfindByPage(finalStringhql,finalObjectvalue,finalintoffset,finalintpageSize){
- //通过一个HibernateCallback对象来执行查询
- Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
- publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
- Listresult=session.createQuery(hql)//为hql语句传入参数
- .setParameter(0,value)
- .setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
- returnresult;
- }
- });
- returnlist;
- }
- /**
- 使用hql进行分页查询
- @paramhql需要查询的hql语句
- @paramvalues如果hql有多个参数需要传入,values就是传入hql语句的参数数组
- @paramoffset第一条记录索引
- @parampageSize当前需要显示的记录数
- @return当前页的所有记录
- */
- publicListfindByPage(finalStringhql,finalObject[]values,finalintoffset,finalintpageSize){
- //通过一个HibernateCallback对象来执行查询
- Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){
- //实现HibernateCallback接口必须实现的方法
- publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{
- //执行Hibernate分页查询
- Queryquery=session.createQuery(hql);
- //为hql语句传入参数
- for(inti=0;i<values.length;i++){
- query.setParamter(i,values[i]);
- }
- Listresult=query.setFirstResult(offset)
- .setMaxResults(pageSize)
- .list();
- returnresult;
- }
- });
- returnlist;
- }
注意:Spring提供的XxxTemplate和XxxCallBack互为补充,XxxTemplate对通用操作进行封装,而XxxCallBack解决了封装后灵活性不足的缺陷。
本文介绍了一种利用HibernateCallback接口增强HibernateTemplate灵活性的方法,并通过具体示例展示了如何使用HQL进行分页查询。


75

被折叠的 条评论
为什么被折叠?



