Hibernaate 调用存储过程的方法

hibernate 数据库编程中,调用存储过程有可能会碰到。虽然不是很常用,但在有些系统中确实存在,存储过程中有着复杂的逻辑,另外存储过程的效率应该相对比较好,所以如果合理使用存储过程, 存储过程还是很有生命力的。

创建一个mysql 的存储过程
程序代码 程序代码

DELIMITER $$

Create PROCEDURE `GetStocks`(int_stockcode VARCHAR(20))
BEGIN
   Select * FROM stock Where stock_code = int_stockcode;
   END $$

DELIMITER ;


如果用mysql 的语句去调用这个存储过程,会采用如下方式
程序代码 程序代码

CALL GetStocks('123456');


hibernate 调用存储过程
一般来说 hibernate 调用存储过程一般有三种方法

1. native sql 原生的SQL 采用 createSQLQuery 去直接调用存储过程
程序代码 程序代码

Query query = session.createSQLQuery(
    "CALL GetStocks(:stockCode)")
    .addEntity(Stock.class)
    .setParameter("stockCode", "7277");

List result = query.list();
for(int i=0; i<result.size(); i++){
    Stock stock = (Stock)result.get(i);
    System.out.println(stock.getStockCode());
}


2. 采用命名查询方式,其实也是native sql 方式,只是用注解方式罢了
程序代码 程序代码

//Stock.java
...
@NamedNativeQueries({
    @NamedNativeQuery(
    name = "callStockStoreProcedure",
    query = "CALL GetStocks(:stockCode)",
    resultClass = Stock.class
    )
})
@Entity
@Table(name = "stock")
public class Stock implements java.io.Serializable {
...


调用 getNamedQuery 方法.

程序代码 程序代码

Query query = session.getNamedQuery("callStockStoreProcedure")
    .setParameter("stockCode", "7277");
List result = query.list();
for(int i=0; i<result.size(); i++){
    Stock stock = (Stock)result.get(i);
    System.out.println(stock.getStockCode());
}


3. 将 sql 语句写在 XML 配置文件中的方式实现

程序代码 程序代码

!-- Stock.hbm.xml -->
...
<hibernate-mapping>
    <class name="com.mkyong.common.Stock" table="stock" ...>
        <id name="stockId" type="java.lang.Integer">
            <column name="STOCK_ID" />
            <generator class="identity" />
        </id>
        <property name="stockCode" type="string">
            <column name="STOCK_CODE" length="10" not-null="true" unique="true" />
        </property>
        ...
    </class>

    <sql-query name="callStockStoreProcedure">
    <return alias="stock" class="com.mkyong.common.Stock"/>
    <![CDATA[CALL GetStocks(:stockCode)]]>
    </sql-query>

</hibernate-mapping>


同样调用 getNamedQuery() 方法
程序代码 程序代码

Query query = session.getNamedQuery("callStockStoreProcedure")
    .setParameter("stockCode", "7277");
List result = query.list();
for(int i=0; i<result.size(); i++){
    Stock stock = (Stock)result.get(i);
    System.out.println(stock.getStockCode());
}


总结,其实这三种方式实现hibernate 调用存储过程,并没有什么本质的不同,其实都是原生SQL 方式,只是方式不一样,具体采用那一种方式,与你自己的程序风格和习惯相关, 自己采取适合自己的方式开发.

除非申明,文章均为一号门原创,转载请注明本文地址,谢谢!
文章来自: 本站原创
引用通告: 查看所有引用 | 我要引用此文章
Tags: Hibernaate 调用存储过程的方法
相关日志:
评论: 0 | 引用: 0 | 查看次数: -
发表评论
昵 称:
密 码: 游客发言不需要密码.
内 容:
验证码: 验证码
选 项:
虽然发表评论不用注册,但是为了保护您的发言权,建议您注册帐号.