HibernateCallback实例可在任何有效的Hibernate数据访问中使用。程序开发者通过HibernateCallBack,可以完全使用Hibernate灵活的方式来访问数据库,解决Spring封装Hibernate后灵活性不足的缺陷。 

HibernateCallback是个接口,该接口包含一个方法doInHibernate(org.hibernate.Session session),该方法只有一个参数Session。 

注意: 

在doInHibernate方法内可访问Session,该Session对象是绑定到该线程的Session实例。在该方法内的持久层操作,与不使用Spring时的持久化操作完全相同。这保证了对于复杂的持久化层访问,依然可以使用Hibernate的访问方式。 

下面是有一个HibernateDaoSupport扩展类(增加了三个分页查询的方法): 

public class ExtendHibernateDaoSupport extends HibernateDaoSupport{
3.
4.         /**
5.        使用hql进行分页查询
6.        @param hql 需要查询的hql语句
7.        @param offset 第一条记录索引
8.        @param pageSize 当前需要显示的记录数
9.        @return 当前页的所有记录   */
10.         public List findByPage(final String hql, final int offset, final int pageSize){
11.                 //通过一个HibernateCallback对象来执行查询
12.                List list = getHibernateTemplate().executeFind(
13.                         new HibernateCallback(){//实现HibernateCallback接口必须实现的方法
14.                             public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询
15.                                List result = session.createQuery(hql)
16.                                .setFirstResult(offset)
17.                                .setMaxResults(pageSize)
18.                                .list();
19.                                 return result;
20.                                }
21.                            });
22.                 return list;
23.        }
24.         /**
25.        使用hql进行分页查询
26.        @param hql 需要查询的hql语句
27.        @param value 如果hql有一个参数需要传入,value就是传入hql语句的参数
28.        @param offset 第一条记录索引
29.        @param pageSize 当前需要显示的记录数
30.        @return 当前页的所有记录
31.        */
32.
33.         public List findByPage(final String hql, final Object value,final int offset, final int pageSize){
34.                 //通过一个HibernateCallback对象来执行查询
35.                 List list = getHibernateTemplate().executeFind(new HibernateCallback(){//实现HibernateCallback接口必须实现的方法
36.                     public Object doInHibernate(Session session)throws HibernateException, SQLException{//执行Hibernate分页查询
37.                         List result = session.createQuery(hql)//为hql语句传入参数
38.                         .setParameter(0,value)
39.                        .setFirstResult(offset)
40.                        .setMaxResults(pageSize)
41.                        .list();
42.                         return result;
43.                        }
44.                    });
45.                 return list;
46.        }
47.         /**
48.
49.        使用hql进行分页查询
50.        @param hql 需要查询的hql语句
51.        @param values 如果hql有多个参数需要传入,values就是传入hql语句的参数数组
52.        @param offset 第一条记录索引
53.        @param pageSize 当前需要显示的记录数
54.        @return 当前页的所有记录
55.        */
56.
57.         public List findByPage(final String hql, final Object[] values,final int offset, final int pageSize){
58.                 //通过一个HibernateCallback对象来执行查询
59.                 List list = getHibernateTemplate().executeFind(new HibernateCallback(){
60.                                         //实现HibernateCallback接口必须实现的方法
61.                     public Object doInHibernate(Session session)throws HibernateException, SQLException{
62.                                                //执行Hibernate分页查询
63.                        Query query = session.createQuery(hql);
64.                                                 //为hql语句传入参数
65.                         for(int i=0; i<values.length; i++){
66.                            query.setParamter(i,values[i]);
67.                            }
68.                        List result = query.setFirstResult(offset)
69.                        .setMaxResults(pageSize)
70.                        .list();
71.                         return result;
72.                        }
73.                    });
74.                 return list;
75.        }

注意:Spring提供的XxxTemplate和XxxCallBack互为补充,XxxTemplate对通用操作进行封装,而XxxCallBack解决了封装后灵活性不足的缺陷。