2017-04-12 72 views
1

我有一個使用JPA的自定義實現來調用存儲過程的彈簧啓動應用程序。問題是,當執行調用時,我得到「在index :: 7處缺少IN或OUT參數」。「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個輸出,最後也是輸出)。

我不明白爲什麼一個工作正常,而另一個沒有。

編輯: 因爲我發現張貼了這個問題之前的問題,我決定省略了很多的代碼是無關的問題,但我會在這裏把這個留給他人找到。

回答

1

在寫這個問題時,我突然有一個想法。

原來,解決方案相當簡單。

顯然,將字符串參數設置爲null不被接受。通過引入空檢查並設置空字符串(本例中爲stacktrace參數)來清空字符串,而不是解決問題。

如果有人遇到此問題,請將此處留下。

相關問題