`

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
分享到:
评论

相关推荐

    JAVA 运用存储过程的分页

    3. **调用存储过程**:创建`CallableStatement`对象,设置存储过程的参数,并执行存储过程。例如: ```java Connection conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/your_db", "username", ...

    存储过程学习经典[语法+实例+调用]

    Hibernate调用Oracle存储过程 Hibernate框架支持直接调用存储过程,通过配置映射文件或注解实现。 ##### 2. Java直接调用Oracle存储过程 使用Java JDBC API可以直接调用Oracle存储过程,通过`CallableStatement`...

    在struts+hibernate框架下实现动态分页

    在Struts和Hibernate这两个流行的Java Web开发框架的组合中,实现动态分页是一项常见的需求。动态分页允许用户浏览大量的数据,而不会一次性加载所有记录,从而提高用户体验和系统性能。下面将详细介绍如何在Struts...

    strute+hibernate写的一个分页

    - **性能优化**:避免在每次分页请求时都计算总记录数,可以使用预计算或者存储过程来获取。 - **安全考虑**:对用户输入的页码和每页记录数进行验证,防止SQL注入等安全问题。 - **用户体验**:合理设置每页显示的...

    Struts+Hibernate的一个好用分页实例

    为了在Hibernate中调用上述存储过程,你需要编写相应的DAO方法,使用`Session`对象的`createSQLQuery`或`call`方法来执行SQL查询或存储过程。 #### 七、总结 本文介绍了一种基于Struts和Hibernate实现高效分页的...

    oracle存储过程学习经典[语法+实例+调用].doc

    - **用Java调用Oracle存储过程**:使用`CallableStatement`接口来调用存储过程,设置输入参数,执行存储过程并获取输出结果。 #### 动态查询在存储过程中的应用 - **本地动态SQL**:在存储过程中构建动态SQL语句,...

    hibernate中实现真分页和假分页技术

    4. 当数据库不支持`LIMIT`和`OFFSET`或`ROW_NUMBER()`时,可能需要通过自定义SQL或存储过程来实现。 总之,理解和熟练运用Hibernate中的分页技术对于优化系统性能至关重要,无论是假分页还是真分页,都需要根据实际...

    oracle 存储过程学习经典

    - **使用Hibernate调用存储过程**: Hibernate提供了一种便捷的方式来调用存储过程,并处理结果集。 #### 九、在存储过程中做简单动态查询 - **本地动态SQL**: 直接在存储过程中构建动态SQL语句。 - **使用DBMS_SQL...

    hibernate通用分页

    在Hibernate中,我们可以使用Criteria、HQL(Hibernate Query Language)或者JPA的Query来实现分页查询。然而,这些方式在每个查询中都需要编写重复的分页代码,这降低了代码的复用性。因此,创建一个通用的分页辅助...

    hiberate SQL Server 2000 存储过程.pdf

    在这个例子中,首先获取Hibernate的Session对象,然后通过`session.connection()`获取底层的JDBC连接,接着创建`CallableStatement`并执行存储过程。注意,由于没有使用Spring进行事务管理,所有操作需要手动提交。 ...

    struts2+spring+hibernate分页显示完整代码

    `queryForPage` 方法通过`getHibernateTemplate().executeFind()`方法执行HQL查询,并利用`HibernateCallback`接口回调来设置查询的起始位置和最大结果数,从而实现分页。`getAllRowCount` 方法则直接返回HQL查询后...

    hibernate+struts后台分页

    3. 缓存:如果数据不常变动,可以使用缓存技术(如Hibernate的第二级缓存)来存储已分页的结果,减少对数据库的访问。 4. 负载均衡和数据库读写分离:在大型系统中,可以通过负载均衡和数据库读写分离进一步提高性能...

    Struts + Hibernate 分页实现

    在数据库查询时,我们需要利用Hibernate的Criteria API或HQL(Hibernate Query Language)来编写分页查询。这通常涉及到设置查询条件、限制查询结果的数量(如每页多少条记录)以及指定查询的起始位置(当前页的第一...

    hibernate + 自定义标签分页

    `Pager` 类是用来存储分页信息的实体类,包括总行数(`totalRows`)、每页显示的行数(`pageSize`)、当前页号(`currentPage`)、总页数(`totalPages`)、当前页在数据库中的起始行(`startRow`)和要跳转的URL(`linkUrl`)...

    java连接Oracle分页显示

    在Java中,我们可以使用JDBC(Java Database Connectivity)来连接Oracle数据库并执行上述SQL语句或调用存储过程。以下是一个基本的示例: ```java import java.sql.*; public class OraclePagingExample { ...

    oracle存储过程学习经典

    5. **调用Oracle存储过程**:通过Java或Hibernate等工具调用Oracle存储过程,需要注意参数传递和结果集的处理。 #### 动态SQL与存储过程 在存储过程中执行动态SQL,有两种主要方式: 1. **本地动态SQL**:适用于...

    oracle存储过程学习经典[语法+实例+调用]

    执行存储过程通常需要`EXECUTE`权限。 - **权限赋予权限**:例如,可以使用`GRANT EXECUTE ON MY_PROCEDURE TO Jelly;`来授予用户Jelly对存储过程MY_PROCEDURE的执行权限。 - **调用示例**:调用存储过程可通过`...

    struts2+hibernate3+spring3分页

    总结,"struts2+hibernate3+spring3分页"项目结合了SSH框架的优势,实现了高效、灵活的后端分页功能,利用MySQL数据库存储数据。开发者可以通过学习这个项目,深入理解如何在实际项目中集成和运用SSH框架,以及如何...

    hibernate jsp 分页Demo

    在这个Demo中,开发者可能使用了Hibernate的Criteria API或HQL来构造动态查询,这允许根据用户输入的页码和每页记录数来定制SQL语句,从而实现分页功能。 5. **readme文件**: 这个文件通常包含了项目的详细说明,...

    存储过程入门

    然后调用execute()方法执行存储过程,并通过CallableStatement对象获取存储过程输出的参数值。 ### Oracle存储过程与函数的区别 存储过程 PROCEDURE 和函数 FUNCTION 都是PL/SQL程序,都可以有返回值。但存储过程是...

Global site tag (gtag.js) - Google Analytics