Как вызвать хранимую процедуру в Hibernate

Как вызвать хранимую процедуру в Hibernate

В этом руководстве вы узнаете, как вызвать процедуру сохранения в Hibernate.

Процедура хранения MySQL

Вот процедура хранилища MySQL, которая принимает параметр кода акции и возвращает соответствующие данные о запасе.

DELIMITER $$

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

DELIMITER ;

В MySQL вы можете просто вызвать его с помощью ключевого словаcall:

CALL GetStocks('7277');

Процедура хранилища вызовов Hibernate

В Hibernate есть три подхода к вызову процедуры хранилища базы данных.

1. Собственный SQL - createSQLQuery

Вы можете использоватьcreateSQLQuery() для непосредственного вызова процедуры хранилища.

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

List result = query.list();
for(int i=0; i

2. NamedNativeQuery в аннотации

Объявите свою процедуру хранения в аннотации@NamedNativeQueries.

//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

3. sql-запрос в файле сопоставления XML

Объявите процедуру сохранения в теге "sql-query".


...

    
        
            
            
        
        
            
        
        ...
    

    
    
    
    

Вызовите это с помощьюgetNamedQuery().

Query query = session.getNamedQuery("callStockStoreProcedure")
    .setParameter("stockCode", "7277");
List result = query.list();
for(int i=0; i

Заключение

Вышеупомянутые три подхода делают то же самое, вызывают процедуру сохранения в базе данных. Между этими тремя подходами нет большой разницы, и какой метод вы выберете, зависит от ваших личных предпочтений.