2017-04-12 6 views
1

JPAを使用してJPAを使用してカスタム・インプリメンテーションでストアド・プロシージャを呼び出す方法があります。問題は、呼び出しを実行するときに「インデックスに:: INまたはOUTパラメータがありません:: 7」が表示されることです。明示的に登録されているにもかかわらず "SQLException:INまたはOUTパラメータがありません"

実装は次のようになります。

​​

これが私の唯一の方法だった場合、私は非常によく、敗北を認め、別のアプローチを試みている可能性があります

public class DbLogImpl implements DbLogCustom { 
    @PersistenceContext 
    private EntityManager em; 

    @Override 
    public Long callInsertLog(Long firstId, Long secondId, Long process, Long subProcess, Long logLevelId, String message, String stacktrace) { 

     Long logId = null; 

     StoredProcedureQuery proc = em.createStoredProcedureQuery("logging_pk.insert_log"); 
     proc.registerStoredProcedureParameter(0, Long.class, IN); 
     proc.registerStoredProcedureParameter(1, Long.class, IN); 
     proc.registerStoredProcedureParameter(2, Long.class, IN); 
     proc.registerStoredProcedureParameter(3, Long.class, IN); 
     proc.registerStoredProcedureParameter(4, Long.class, IN); 
     proc.registerStoredProcedureParameter(5, String.class, IN); 
     proc.registerStoredProcedureParameter(6, String.class, IN); 
     proc.setParameter(0, firstId); 
     proc.setParameter(1, secondId); 
     proc.setParameter(2, process); 
     proc.setParameter(3, subProcess); 
     proc.setParameter(4, logLevelId); 
     proc.setParameter(5, message); 
     proc.setParameter(6, stacktrace); 
     proc.registerStoredProcedureParameter(7, Long.class, OUT); 
     proc.execute(); 

     logId = (Long) proc.getOutputParameterValue(7); 

     return logId; 
    } 
} 

私のパッケージには、このようになります。 (実際には出力パラメータの値を取得せずに、ネイティブクエリを処理することができました。)しかし、これとまったく同じようにセットアップされ、うまく動作する別のストアドプロシージャコールがあります。唯一の違いは、パラメータの名前と数です(作業中のものは3つの入力と1つの出力を持ち、最後に出力もあります)。

もう一方がうまくいかない理由はわかりません。

EDIT: 私はこの質問を投稿する前に問題を発見したように、私は質問とは無関係であるコードの多くを省略することにしましたが、私は見つけるために、他の人のためにここにこれを残します。

答えて

1

この質問を書いているうちに、突然私は考えました。

明らかに、解決策はかなり単純でした。

明らかに、Stringパラメータをnullに設定することはできません。ヌルチェックを導入し、ヌル文字列(この場合はstacktraceパラメータ)を空の文字列に設定することで、代わりに問題が解決されました。

他の人がこの問題に遭遇した場合に備えて、このままにしておきます。

関連する問題