`
j2ee_chenwei
  • 浏览: 41482 次
  • 性别: Icon_minigender_1
  • 来自: 重庆
最近访客 更多访客>>
社区版块
存档分类
最新评论

hibernate中使用存储过程

阅读更多
hibernate中使用存储过程
http://tb.blog.csdn.net/TrackBack.aspx?PostId=546174

如果底层数据库(如Oracle)支持存储过程,也可以通过存储过程来执行批量更新。存储过程直接在数据库中运行,速度更加快。在Oracle数据库中可以定义一个名为batchUpdateStudent()的存储过程,代码如下:

create or replace procedure batchUpdateStudent(p_age in number) as
begin
update STUDENT set AGE=AGE+1 where AGE>p_age;
end;

以上存储过程有一个参数p_age,代表学生的年龄,应用程序可按照以下方式调用存储过程:

tx = session.beginTransaction();
Connection con=session.connection();

String procedure = "{call batchUpdateStudent(?) }";
CallableStatement cstmt = con.prepareCall(procedure);
cstmt.setInt(1,0); //把年龄参数设为0
cstmt.executeUpdate();
tx.commit();


引自: http://www.afuer.com/article.asp?id=140

使用存储过程来查询  
   Hibernate    3引入了对存储过程查询的支持.    存储过程必须返回一个结果集,作为Hibernate能够使用的第一个外部参数.    下面是一个Oracle9和更高版本的存储过程例子.    
   
   Create    or    REPLACE    FUNCTION    selectAllEmployments    
           RETURN    SYS_REFCURSOR    
   AS    
           st_cursor    SYS_REFCURSOR;    
   BEGIN    
           OPEN    st_cursor    FOR    
     Select    EMPLOYEE,    EMPLOYER,    
     STARTDATE,    ENDDATE,    
     REGIONCODE,    EID,    VALUE,    CURRENCY    
     FROM    EMPLOYMENT;    
               RETURN      st_cursor;    
     END;  
   在Hibernate里要要使用这个查询,你需要通过命名查询来映射它.    
   
   <sql-query    name="selectAllEmployees_SP"    callable="true">  
           <return    alias="emp"    class="Employment">  
                   <return-property    name="employee"    column="EMPLOYEE"/>  
                   <return-property    name="employer"    column="EMPLOYER"/>                          
                   <return-property    name="startDate"    column="STARTDATE"/>  
                   <return-property    name="endDate"    column="ENDDATE"/>                          
                   <return-property    name="regionCode"    column="REGIONCODE"/>                          
                   <return-property    name="id"    column="EID"/>                                                  
                   <return-property    name="salary">    
                           <return-column    name="VALUE"/>  
                           <return-column    name="CURRENCY"/>                          
                   </return-property>  
           </return>  
           {    ?    =    call    selectAllEmployments()    }  
   </sql-query>  
   
   注意存储过程当前仅仅返回标量和实体.现在不支持<return-join>和<load-collection>    

引自: http://sjes.com.cn/3frffgxs/2007-7-1/dispbbs_850_252f22232f20

<hibernate-mapping package="com.unmi.vo"> <class name="Test" table="TEST"/>      

<sql-query callable="true" name="selectAllUsers">

<return alias="aa" class="Test"> <return-property name="oborqt" column="OBORQT"/>

<return-property name="moorqt" column="MOORQT"/> <return-property name="roschn" column="ROSCHN"/>

<return-property name="plandate" column="PLANDATE"/>

<return> { ? = call selectAllUsers() } </sql-query>

</hibernate-mapping>

{ ? = call selectAllUsers() } 也可以写成{ call selectAllUsers() }, 如果有参数就写成 { ? = call selectAllUsers(?,?,?) } 代码中对query设置相应位置上的值就OK Java调用关键代码如下

Session session = HibernateUtil.currentSession();

Query query = session.getNamedQuery("selectAllUsers");

List list = query.list();

System.out.println(list);

要求你的存储过程必须能返回记录集,否则要出错 如果你的存储过程是完成非查询任务就应该在配置文件用以下三个标签

<sql-insert callable="true">{call createPerson (?, ?)}</sql-insert>

<sql-delete callable="true">{? = call deletePerson (?)}</sql-delete>

<sql-update callable="true">{? = call updatePerson (?, ?)}</sql-update>

注: 直接从hibernate的session中取connection出来调呗,按照hibernate的思想,存储过程是要少用的,所以对hibernate的支持好像不是很好

分享到:
评论

相关推荐

    Hibernate使用存储过程

    本文将深入探讨如何在Hibernate中使用存储过程。 首先,存储过程是在数据库层面预先编译好的一组SQL语句,它可以接受输入参数,处理数据,并返回结果。使用存储过程的优点包括性能提升、代码复用和安全性增强。在...

    hibernate调用存储过程

    hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程 hibernate调用存储过程

    hibernate query调用oracle存储过程

    在Hibernate中,调用存储过程通常通过Session对象的createNativeQuery()方法实现,这个方法用于创建原生SQL查询,可以方便地调用数据库的自定义SQL或者存储过程。以下是一个简单的示例,展示了如何调用一个不带参数...

    hibernate框架调用存储过程

    本篇文章将深入探讨如何在Hibernate框架中调用存储过程,并与JDBC调用存储过程的方式进行比较。 首先,我们要了解存储过程是什么。存储过程是预编译的SQL语句集合,存储在数据库服务器中,可被多次调用,减少了网络...

    hibernate存储过程

    在上述的"hibernate存储过程"话题中,我们关注的是如何在Hibernate中使用存储过程。 存储过程是预编译的SQL代码集合,存储在数据库中,可以被多次调用,提高了代码的复用性和执行效率。在Hibernate中使用存储过程,...

    hibernate调用存储过程的方法调用

    Hibernate作为Java领域内广泛使用的对象关系映射(ORM)框架,提供了调用数据库存储过程的能力。本文将深入探讨如何使用Hibernate调用存储过程,并结合提供的资源文件——`proc.sql`、`hibernateProc.sql`和`...

    spring hibernate执行存储过程的例子

    Spring和Hibernate是Java开发中常用的两个框架,它们提供了对存储过程的支持。本文将深入探讨如何在Spring和Hibernate中执行存储过程,并基于描述中的例子进行解析。 首先,让我们了解Spring如何执行存储过程。...

    使用hibernate调用oracle的存储过程

    在hibernate中调用oracle中的存储过程的详细代码。可以借鉴使用,帮助学习。

    hibernate调用存储过程具体方法

    hibernate本对数据库的操作有些不完美,有必要的时候可以调用存储过程来补足。

    hiberate SQL Server 2000 存储过程.pdf

    下面将深入探讨这一主题,包括为什么在Hibernate中使用存储过程、如何使用以及在特定场景下的应用。 ### Hibernate与SQL Server 2000存储过程 #### 1. 为何在Hibernate中使用存储过程? 尽管在Hibernate中直接...

    hibernate 3.1 存储过程

    Hibernate 3.1 是一个流行的Java对象关系映射(ORM)...通过以上步骤,你可以在Hibernate 3.1中顺利地集成和使用存储过程。在实际项目中,根据具体需求调整和优化这些方法,可以进一步提高你的应用程序的效率和安全性。

    Hibernate3调用存储过程用法

    在Java的持久化框架Hibernate中,调用数据库的存储过程是一项常见的需求。本文将深入探讨在Hibernate3中如何实现这一功能,以及相关的知识点。 一、为什么要使用存储过程 存储过程是预编译的SQL语句集合,它们在...

    hibernate环境搭建已经对应存储过程调用

    2. **定义CallabledStatement**:在Hibernate中,使用Session的doWork方法或者Session的createCallableStatement方法来执行存储过程。 3. **映射输出参数和结果集**:如果存储过程有输出参数或结果集,你需要定义...

    Hibernate 调用存储过程

    3. **非查询任务**:如果存储过程是为了执行非查询操作(如插入、删除数据),那么应该在Hibernate配置文件中使用以下三个标签: - `&lt;sql-insert callable="true"&gt;{call createPerson(?,?)}&lt;/sql-insert&gt;` - `...

    Hibernate存储过程的调用

    ### Hibernate存储过程调用详解 #### 一、概述 在软件开发过程中,为了提高数据库操作的性能和安全性,经常会使用到存储过程。特别是在处理复杂的业务逻辑或者需要进行大量数据更新时,存储过程能够提供更好的解决...

Global site tag (gtag.js) - Google Analytics