`

hibernate调用存储过程来分页

阅读更多

      虽然Hibernate帮助我们完成了分页功能,但若有的数据库不支技分页查询,Hibernate的分页的效率可就不高了,它先查询出一部分然后现在内存当中取出你所要的那一页。

      Hibernate支持Native SQL(使用SQL Query)也、支持存储过程下面就来说说Hibernate调用存储过程来分页

在数据库创建Ture_Page存储过程

SET QUOTED_IDENTIFIER ON
GO
SET ANSI_NULLS OFF
GO

ALTER  PROCEDURE Ture_Page

    @PageSize    int,        --每页的行数
    @PageIndex    int,        --1 代表第一页
    @Col        varchar(250),    --要显示的字段
    @Table        varchar(200),    --所用到的表,复条的话就写from与where之间的内容
    @Where    varchar(200)='',    --所用到的条件
    @OKey        varchar(50),    --排序字段
    @Order        varchar(20)='ASC'   --排序方式

as
 declare @cmdstr varchar(2000)
 declare @cmdstrcount  varchar(2000)

 set nocount on
       
        set @cmdstr='select top '
        set @cmdstr=@cmdstr+convert(nvarchar,@PageSize)
        if @Order='DESC' and @PageIndex>1
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'<'

        else if @PageIndex=1
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>='
        else
 set @cmdstr=@cmdstr+' '+@Col+' from '+@Table+' where '+@OKey+'>'

        if @PageIndex>1
          begin

   if @Order='ASC'
             set @cmdstr=@cmdstr+'(select max ('+@OKey+') from (select top '
  else
        set @cmdstr=@cmdstr+'(select min ('+@OKey+') from (select top '

            set @cmdstr=@cmdstr+convert(nvarchar,(@PageIndex-1)*@PageSize)
      if @Where<>''
              set @cmdstr=@cmdstr+' '+@OKey+' from '+@Table+'   where   '+@Where+'   order by '+@OKey+' '+@Order+') as t) '
  else
                 set @cmdstr=@cmdstr+' '+@OKey+' from '+@Table+'    order by '+@OKey+' '+@Order+') as t) '
          end

        else
          set @cmdstr=@cmdstr+' 0 ' --convert(nvarchar,0)

         print @cmdstr

        if @Where<>''
            set @cmdstr=(@cmdstr+'  and '+@Where+' order by '+@OKey+' '+@Order)
        else
            set @cmdstr=(@cmdstr+'  order by '+@OKey+' '+@Order)
       
       print @cmdstr
        exec(@cmdstr)
    set nocount off
GO
SET QUOTED_IDENTIFIER OFF
GO
SET ANSI_NULLS ON
GO

Hibernate的配置文件:
    <hibernate-mapping>
    <class name="com.mengya.entity.TDepart" table="t_depart" schema="dbo" catalog="oaproject">
        <id name="DId" type="java.lang.Integer">
            <column name="d_id" />
            <generator class="native" />
        </id>
        <property name="DName" type="java.lang.String">
            <column name="d_name" length="50" />
        </property>
        <property name="DRemark" type="java.lang.String">
            <column name="d_remark" />
        </property>
        <set name="TEmps" inverse="true">
            <key>
                <column name="d_id" />
            </key>
            <one-to-many class="com.mengya.entity.TEmp" />
        </set>      
    </class>

    <!--<sql-query>不在<class>内面-->
    <sql-query name="TDepartTure_Page" callable="true">
         <return alias="TDepart" class="com.mengya.entity.TDepart">
          <return-property name="DId" column="d_id"/>
          <return-property name="DName" column="d_name"/>
          <return-property name="DRemark" column="d_remark"/>
         </return>
         {call Ture_Page(?,?,?,?,?,?,?)}
         <query-param name="PageSize" type="int"/>
      <query-param name="PageIndex" type="int"/>
      <query-param name="Col" type="String"/>
      <query-param name="Table" type="String"/>
      <query-param name="Where" type="String"/>
      <query-param name="OKey" type="String"/>
      <query-param name="Order" type="String"/>      
        </sql-query>
</hibernate-mapping>    
 调用存储过程:
    ......
/*
  * 分页查询所有部门信息
  */
 public List getPageDepart(final int pagesize,final int pageindex){
  List pagelist=null;
  try {

   //这里我使用的Hibernate的getHibernateTemplate()方法也要可直接得到session
   pagelist=getHibernateTemplate().executeFind(new HibernateCallback(){

    public Object doInHibernate(Session session) throws HibernateException, SQLException {
     Query query=session.getNamedQuery("TDepartTure_Page");
     query.setInteger(0, pagesize);
     query.setInteger(1, pageindex);
     query.setString(2, "d_id,d_name,d_remark");
     query.setString(3, "t_depart");
     query.setString(4, "");
     query.setString(5, "d_id");
     query.setString(6, "desc");
     return query.list();
    }
    
   });
  } catch (RuntimeException e) {
   e.printStackTrace();
   throw e;
  }
  return pagelist;
 }

在本类中,调用查询类存储过程时,调用session.getNamedQuery("")方法来获得User.hbm.xml中配置的查询存储过程。在其余的存储过程调用的测试中,首先通过hibernatesession获得connection,然后调用connection对象的相应方法来实现存储过程的调用。

同样,这样做的话也会带来弊端可移植性差。改库的话也要创建该存储过程

5
0
分享到:
评论

相关推荐

    自学oracle存储过程

    6. Hibernate 调用 Oracle 存储过程..................................................................................... 6 用 Java 调用 Oracle 存储过程总结..................................................

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    Hibernate 中文 html 帮助文档

    16.2.2. 使用存储过程来查询 16.2.2.1. 使用存储过程的规则和限制 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作...

    最全Hibernate 参考文档

    16.3.2. 使用存储过程来查询 16.3.2.1. 使用存储过程的规则和限制 16.4. 定制SQL用来create,update和delete 16.5. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作...

    Hibernate教程

    17.3.2. 使用存储过程来查询 17.3.2.1. 使用存储过程的规则和限制 17.4. 定制SQL用来create,update和delete 17.5. 定制装载SQL 18. 过滤数据 18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据进行...

    hibernate 体系结构与配置 参考文档(html)

    使用存储过程来查询 16.3.2.1. 使用存储过程的规则和限制 16.4. 定制SQL用来create,update和delete 16.5. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作 ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part1.rar

     9.6 通过Hibernate调用存储过程  9.7 小结  9.8 思考题 第10章 映射组成关系  10.1 建立精粒度对象模型  10.2 建立粗粒度关系数据模型  10.3 映射组成关系  10.3.1 区分值(Value)类型和实体(Entity)类型...

    hibernate3.04中文文档.chm

    17.3.2. 使用存储过程来查询 17.3.2.1. 使用存储过程的规则和限制 17.4. 定制SQL用来create,update和delete 17.5. 定制装载SQL 18. 过滤数据 18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据...

    Hibernate3+中文参考文档

    16.3.2. 使用存储过程来查询 16.3.2.1. 使用存储过程的规则和限制 16.4. 定制SQL用来create,update和delete 16.5. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作...

    hibernate 框架详解

    使用存储过程来查询 17.3.2.1. 使用存储过程的规则和限制 17.4. 定制SQL用来create,update和delete 17.5. 定制装载SQL 18. 过滤数据 18.1. Hibernate 过滤器(filters) 19. XML映射 19.1. 用XML数据进行...

    Hibernate3的帮助文档

    详细的Hibernate3的帮助文档 前言 1. 翻译说明 2. 版权声明 1. 在Tomcat中快速上手 1.1. 开始Hibernate之旅 1.2. 第一个持久化类 1.3. 映射cat 1.4. 与Cat同乐 1.5. 结语 2. Hibernate入门 2.1. 前言 2.2. ...

    Hibernate参考文档

    16.2.2. 使用存储过程来查询 16.2.2.1. 使用存储过程的规则和限制 16.3. 定制SQL用来create,update和delete 16.4. 定制装载SQL 17. 过滤数据 17.1. Hibernate 过滤器(filters) 18. XML映射 18.1. 用XML数据进行工作...

    低清版 大型门户网站是这样炼成的.pdf

    5.12 hibernate调用存储过程 343 5.13 xml数据持久化 346 5.14 小结 348 第6章 充分利用spring 2.5的ioc利器统管bean世界 349 6.1 java程序员的春天厚礼—spring 2.5 349 6.1.1 爱上spring 2.5的十大理由 350 ...

    二十一道面试程序.txt

    8. 写出Oracle增删改查的存储过程,并在java中调用。 9. 用ajax技术实现一个级联菜单功能。 10.写出插入法进行排序代码。 11.编写一个截取字符串的函数,输入为一个字符串和字节数,输出为按字节截取的字符串。 但是...

    Java面试宝典2020修订版V1.0.1.doc

    19、用JDBC如何调用存储过程 69 20、JDBC中的PreparedStatement相比Statement的好处 71 21、写一个用jdbc连接实例。 71 22、ArrayList和Vector的区别? 73 23、List、Set和Map的区别? 74 24、Collection 和 ...

    2021年最新java面试题--视频讲解(内部培训84个知识点超详细).rar

    Java面试题31.jdbc调用存储过程 Java面试题32.简单说一下你对jdbc的理解 Java面试题33.写一个jdbc的访问oracle的列子 Java面试题34.jdbc中preparedStatement比Statement的好处 Java面试题35.数据库连接池的作用 Java...

    sqltoy-orm框架系统-其他

    6、提供行列转换(数据旋转),避免写复杂的sql或存储过程,用算法来化解对sql的高要求,同时实现数据库无关(不管是mysql还是sqlserver) 7、提供分组汇总求平均算法(用算法代替sql避免跨数据库语法不一致) 8、分库分表...

Global site tag (gtag.js) - Google Analytics