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解决了封装后灵活性不足的缺陷。