[Hibenate] Gọi store procedure trong hibernate

Chào các bạn, trong bài viết này, chúng ta sẽ tìm hiểu về cách gọi store procedure trong hibernate


MySQL store procedure
Đây là 1 store procedure trong MySQL, nó nhận vào 1 tham số là stock code và trả về dữ liệu liên quan đến stock.

SQL:
DELIMITER $$

CREATE PROCEDURE `GetStocks`(int_stockcode varchar(20))
BEGIN
   SELECT * FROM stock where stock_code = int_stockcode;
   END $$

DELIMITER ;
Trong MySQL, có thể gọi bằng keyword call:

SQL:
CALL GetStocks('7277');

Sử dụng Hibernate để gọi store procedure
Trong Hibernate, có 3 cách để gọi store procedure trong database.

1. Native SQL – createSQLQuery
Sử dụng createSQLQuery() để gọi store procedure trực tiếp.

Java:
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. NamedNativeQuery annotation
Khai báo store procedure bên trong @NamedNativeQueries annotation.

Java:
//Stock.java
...
@NamedNativeQueries({
    @NamedNativeQuery(
    name = "callStockStoreProcedure",
    query = "CALL GetStocks(:stockCode)",
    resultClass = Stock.class
    )
})
@Entity
@Table(name = "stock")
public class Stock implements java.io.Serializable {
...
Gọi nó bằng getNamedQuery().

Java:
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-query trong file mapping XML
Khai báo store procedure trong thẻ “sql-query”.

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>
Gọi nó với getNamedQuery().

Java:
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());
}

Kết luận
Ba cách trên đều tương tự nhau về cách thực thi, gọi store procedure trong database. Không có nhiều khác biệt lớn giữa ba phương pháp, hãy chọn 1 trong các cách trên dựa vào sở thích của bạn.


Cám ơn các bạn đã theo dõi. Hẹn gặp lại các bạn trong các bài viết sau :D

Bài viết tham khảo tại: https://mkyong.com/hibernate/how-to-call-store-procedure-in-hibernate/
 

Bình luận