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", ?);
どんな助けでもありがたいです:)
これを行う最も簡単な方法は、返されるパラメーターの一部として出力パラメーターを返すことです(ストアプロシージャにアクセスできる場合にのみ関連します)。
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を実行して追加できます。
それが役に立てば幸い
私は 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");
例:
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"));
@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を設定しました