Spring中使用HibernateCallback

本文介绍了一种利用HibernateCallback接口增强HibernateTemplate灵活性的方法,并通过具体示例展示了如何使用HQL进行分页查询。

HibernateTemplate还提供一种更加灵活的方式来操作数据库,通过这种方式可以完全使用Hibernate的操作方式。这种灵活方式主要是通过如下两个方法完成的:

(1)

Java代码 复制代码 收藏代码
  1. Objectexecute(HibernateCallbackaction)
Java代码 收藏代码
  1. Objectexecute(HibernateCallbackaction)



(2)

Java代码 复制代码 收藏代码
  1. ListexecuteFind(HibernateCallbackaction)
Java代码 收藏代码
  1. ListexecuteFind(HibernateCallbackaction)



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

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

注意:

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

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

Java代码 复制代码 收藏代码
  1. //==============================================
  2. publicclassExtendHibernateDaoSupportextendsHibernateDaoSupport{
  3. /**
  4. 使用hql进行分页查询
  5. @paramhql需要查询的hql语句
  6. @paramoffset第一条记录索引
  7. @parampageSize当前需要显示的记录数
  8. @return当前页的所有记录*/
  9. publicListfindByPage(finalStringhql,finalintoffset,finalintpageSize){
  10. //通过一个HibernateCallback对象来执行查询
  11. Listlist=getHibernateTemplate().executeFind(
  12. newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
  13. publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
  14. Listresult=session.createQuery(hql)
  15. .setFirstResult(offset)
  16. .setMaxResults(pageSize)
  17. .list();
  18. returnresult;
  19. }
  20. });
  21. returnlist;
  22. }
  23. /**
  24. 使用hql进行分页查询
  25. @paramhql需要查询的hql语句
  26. @paramvalue如果hql有一个参数需要传入,value就是传入hql语句的参数
  27. @paramoffset第一条记录索引
  28. @parampageSize当前需要显示的记录数
  29. @return当前页的所有记录
  30. */
  31. publicListfindByPage(finalStringhql,finalObjectvalue,finalintoffset,finalintpageSize){
  32. //通过一个HibernateCallback对象来执行查询
  33. Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
  34. publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
  35. Listresult=session.createQuery(hql)//为hql语句传入参数
  36. .setParameter(0,value)
  37. .setFirstResult(offset)
  38. .setMaxResults(pageSize)
  39. .list();
  40. returnresult;
  41. }
  42. });
  43. returnlist;
  44. }
  45. /**
  46. 使用hql进行分页查询
  47. @paramhql需要查询的hql语句
  48. @paramvalues如果hql有多个参数需要传入,values就是传入hql语句的参数数组
  49. @paramoffset第一条记录索引
  50. @parampageSize当前需要显示的记录数
  51. @return当前页的所有记录
  52. */
  53. publicListfindByPage(finalStringhql,finalObject[]values,finalintoffset,finalintpageSize){
  54. //通过一个HibernateCallback对象来执行查询
  55. Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){
  56. //实现HibernateCallback接口必须实现的方法
  57. publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{
  58. //执行Hibernate分页查询
  59. Queryquery=session.createQuery(hql);
  60. //为hql语句传入参数
  61. for(inti=0;i<values.length;i++){
  62. query.setParamter(i,values[i]);
  63. }
  64. Listresult=query.setFirstResult(offset)
  65. .setMaxResults(pageSize)
  66. .list();
  67. returnresult;
  68. }
  69. });
  70. returnlist;
  71. }
Java代码 收藏代码
  1. //==============================================
  2. publicclassExtendHibernateDaoSupportextendsHibernateDaoSupport{
  3. /**
  4. 使用hql进行分页查询
  5. @paramhql需要查询的hql语句
  6. @paramoffset第一条记录索引
  7. @parampageSize当前需要显示的记录数
  8. @return当前页的所有记录*/
  9. publicListfindByPage(finalStringhql,finalintoffset,finalintpageSize){
  10. //通过一个HibernateCallback对象来执行查询
  11. Listlist=getHibernateTemplate().executeFind(
  12. newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
  13. publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
  14. Listresult=session.createQuery(hql)
  15. .setFirstResult(offset)
  16. .setMaxResults(pageSize)
  17. .list();
  18. returnresult;
  19. }
  20. });
  21. returnlist;
  22. }
  23. /**
  24. 使用hql进行分页查询
  25. @paramhql需要查询的hql语句
  26. @paramvalue如果hql有一个参数需要传入,value就是传入hql语句的参数
  27. @paramoffset第一条记录索引
  28. @parampageSize当前需要显示的记录数
  29. @return当前页的所有记录
  30. */
  31. publicListfindByPage(finalStringhql,finalObjectvalue,finalintoffset,finalintpageSize){
  32. //通过一个HibernateCallback对象来执行查询
  33. Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){//实现HibernateCallback接口必须实现的方法
  34. publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{//执行Hibernate分页查询
  35. Listresult=session.createQuery(hql)//为hql语句传入参数
  36. .setParameter(0,value)
  37. .setFirstResult(offset)
  38. .setMaxResults(pageSize)
  39. .list();
  40. returnresult;
  41. }
  42. });
  43. returnlist;
  44. }
  45. /**
  46. 使用hql进行分页查询
  47. @paramhql需要查询的hql语句
  48. @paramvalues如果hql有多个参数需要传入,values就是传入hql语句的参数数组
  49. @paramoffset第一条记录索引
  50. @parampageSize当前需要显示的记录数
  51. @return当前页的所有记录
  52. */
  53. publicListfindByPage(finalStringhql,finalObject[]values,finalintoffset,finalintpageSize){
  54. //通过一个HibernateCallback对象来执行查询
  55. Listlist=getHibernateTemplate().executeFind(newHibernateCallback(){
  56. //实现HibernateCallback接口必须实现的方法
  57. publicObjectdoInHibernate(Sessionsession)throwsHibernateException,SQLException{
  58. //执行Hibernate分页查询
  59. Queryquery=session.createQuery(hql);
  60. //为hql语句传入参数
  61. for(inti=0;i<values.length;i++){
  62. query.setParamter(i,values[i]);
  63. }
  64. Listresult=query.setFirstResult(offset)
  65. .setMaxResults(pageSize)
  66. .list();
  67. returnresult;
  68. }
  69. });
  70. returnlist;
  71. }



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

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值