0

MySQL を使用する Java アプリケーションから MySQL ストアド プロシージャを呼び出そうとしています。以下は、DAO でストアド プロシージャ「insertComm」を呼び出していた部分です。

String opt="REFUND";
        Query query = this.getSession().createSQLQuery("CALL insertComm (:remitNo,     :opt)")
           .setParameter("remitNo", remitNo)
               .setParameter("opt", opt);
opt=query.toString();
hemappLogger.info(opt);

しかし、データベースにクエリを実行して確認すると、ストアド プロシージャは実行されていません。「opt」値は SQLQueryImpl(CALL insertComm (:remitNo, :opt)) として表示されます。

パラメータは問題なく、アプリケーションもエラーを表示していません。見逃したものは見えません。

4

3 に答える 3

3

基本型を出力する単純なストアド プロシージャがあるとします。

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");

ストアド プロシージャがREFCURSORまたはTABLE結果を返す場合:

CREATE PROCEDURE post_comments(IN postId INT) 
BEGIN
    SELECT *  
    FROM post_comment   
    WHERE post_id = postId;  
END

次のようにストアド プロシージャを呼び出す必要があります。

StoredProcedureQuery query = entityManager
    .createStoredProcedureQuery("post_comments");
query.registerStoredProcedureParameter(1, Long.class, ParameterMode.IN);
 
query.setParameter(1, 1L);
 
List<Object[]> postComments = query.getResultList();

OUT結果セットを変数に入れる代わりに返すデータベース関数の場合:

CREATE FUNCTION fn_count_comments(postId integer)
RETURNS integer
DETERMINISTIC 
READS SQL DATA 
BEGIN
    DECLARE commentCount integer; 
    SELECT COUNT(*) INTO commentCount 
    FROM post_comment  
    WHERE post_comment.post_id = postId; 
    RETURN commentCount; 
END

Hibernate 4.x および 5.x API は役に立たず、代わりに JDBC を使用する必要があります。

int commentCount = session.doReturningWork(connection -> {
    try (CallableStatement function = connection.prepareCall(
            "{ ? = call fn_count_comments(?) }")) {
        function.registerOutParameter(1, Types.INTEGER);
        function.setInt(2, 1);
        function.execute();
        return function.getInt(1);
    }
});
于 2016-11-04T09:22:27.873 に答える
2

残念ながら、を使用してストアド プロシージャを呼び出すことはできませんSession.createSQLQuery()名前が示すように、SQLクエリを作成できます。プロシージャ コールはクエリではありません。

しかし、恐れる必要はありません。回避策は次のとおりです。

Connection conn = getSession().connection();
CallableStatment stat = conn.prepareCall("{CALL insertComm (?,?)}");
stat.setString(1, remitNo); // Assuming both parameters are String
stat.setString(2, opt);

stat.executeUpdate();
stat.close();
于 2013-01-16T05:16:11.603 に答える
1

セッションオブジェクトにエンティティを追加しませんでした... .addEntity(classname.class).setParameter()

于 2013-01-16T05:06:04.843 に答える