web-dev-qa-db-ja.com

INパラメータとOUTパラメータの両方を持つストアドプロシージャをHibernateから呼び出す方法

Hibernateからストアドプロシージャを呼び出して、out値を返したいのですが。これが私のストアドプロシージャです。

create procedure myProcedure
(  
in in_Id int,  
out out_Id int  
)  
begin  
...  
END;

私はこれを私の手順を呼び出すために試しています

Query query = session.createSQLQuery(  
"CALL myProcedure(:in_Id)")  
.setParameter("in_id", 123);   
//Not sure how to register out parameters...??      
List result = query.list();

私はすべてを試しましたが、運はありませんでした。手伝ってくれませんか?上記を試してみると:

PROCEDURE myProcedureの引数の数が正しくありません。2が必要です、1を取得しました

私はのような出力パラメータを追加しようとしました

myProcedure(:out_id:in_Id)

しかしそれは言う

すべての名前付きパラメーターが設定されているわけではありません:

Outパラメータの設定方法がわかりません。次のようですか?

.setParameter("out_id", ?);

どんな助けでもありがたいです:)

12
Waseem Khan

これを行う最も簡単な方法は、返されるパラメーターの一部として出力パラメーターを返すことです(ストアプロシージャにアクセスできる場合にのみ関連します)。
jestは次のようなストアプロシージャを追加します

create procedure myProcedure_only_in_parms (
   in in_Id int)
begin
call myProcedure(in_id,@out_Id) ;
select @out_id
END;

その後、Hibernetで次のように使用するのは非常に簡単です。

Query query = session.createSQLQuery(
"CALL myProcedure_only_in_parms (:in_Id)")
.setParameter("in_id", 123);
List result = query.list();

結果には出力パラメーターが含まれますが、乗算パラメーターを返す場合は、select @ parm1、@ parm2、...、@ parmnを実行して追加できます。

それが役に立てば幸い

7
Asaf Manassen

私は HibernateからMySQLストアドプロシージャとデータベース関数を呼び出す方法 について非常に詳細な記事を書きましたが、ここでも短い要約を書きます。

基本的なタイプを出力する単純なストアドプロシージャがあるとすると、

CREATE PROCEDURE count_comments (
   IN postId INT, 
   OUT commentCount INT
) 
BEGIN
    SELECT COUNT(*) INTO commentCount 
    FROM post_comment  
    WHERE post_comment.post_id = postId; 
END

JPA StoredProcedureQueryを使用して、このストアドプロシージャを呼び出すことができます。

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("count_comments")
    .registerStoredProcedureParameter(
        "postId", Long.class, ParameterMode.IN)
    .registerStoredProcedureParameter(
        "commentCount", Long.class, ParameterMode.OUT)
    .setParameter("postId", 1L);

query.execute();

Long commentCount = (Long) query
    .getOutputParameterValue("commentCount");
5
Vlad Mihalcea

例:

        Session session = em.unwrap(Session.class);
        session.setHibernateFlushMode(FlushMode.MANUAL);
        ProcedureCall query = session.createStoredProcedureCall("dbo.sp_getorderlistbyparam",BasicResult.class);
        query.registerParameter("search_text",String.class, ParameterMode.IN).bindValue(searchText);
        query.registerParameter("membership_nbr",String.class, 
        query.registerParameter("is_debug",Integer.class, ParameterMode.IN).bindValue(0);
        query.registerParameter("result_count",Integer.class, ParameterMode.OUT);
        basicResults = (List<BasicResult>) query.getResultList();
        ProcedureOutputs procedureOutputs = query.getOutputs();
        parameterMap.put("totalOrderCnt" ,(Integer) procedureOutputs.getOutputParameterValue("result_count"));
0
Quincy
@PersistenceContext 
private EntityManager entitymanager;
     @Override
            public String function(int id, int emp_id, String letype, String days, Date fromdate, Date todate, String reason,
                    String backup, int user_id) {

                //Session session = entitymanager.unwrap(Session.class);

                StoredProcedureQuery  applyLeave = entitymanager.createStoredProcedureQuery("sp_apply_leave");

                applyLeave.registerStoredProcedureParameter("p_id", Integer.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_emp_id", Integer.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_letype", String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_days", String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_fmdate", Date.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_todate", Date.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_reason", String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_backper", String.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("p_user_id", Integer.class, ParameterMode.IN)
                        .registerStoredProcedureParameter("error_msg", String.class, ParameterMode.INOUT);


                applyLeave.setParameter("p_id", id);
                applyLeave.setParameter("p_emp_id" , emp_id);
                applyLeave.setParameter("p_letype" , letype);
                applyLeave.setParameter("p_days" , days);
                applyLeave.setParameter("p_fmdate" , fromdate);
                applyLeave.setParameter("p_todate" , todate);
                applyLeave.setParameter("p_reason" , reason);
                applyLeave.setParameter("p_backper" , backup);
                applyLeave.setParameter("p_user_id" , user_id);
                applyLeave.setParameter("error_msg", new String("error_msg"));
                //applyLeave.executeUpdate();

                String error_msg = (String) applyLeave.getOutputParameterValue("error_msg");
                return error_msg;

            }

ここで私はautowired entitymanagerを持ち、設定パッケージでhibernate Persistenceを設定しました