2015-10-08 52 views
0

回到我使用SimpleJdbcCall執行存儲過程如下:春:存儲過程輸出參數在錯誤的順序

public static List<Object> callSp(JdbcTemplate jdbcTemplate, String storedProcedureName, Object... inParameters) { 
    try { 
     final SimpleJdbcCall jdbcCall = new SimpleJdbcCall(jdbcTemplate).withProcedureName(storedProcedureName); 
     return newArrayList(jdbcCall.execute(inParameters).values()); 
    } catch (DataAccessException e) { 
     throw new RuntimeException(e.getMessage(), e); 
    } 
} 

一切工作的魅力,但我面臨以下問題:在存儲過程中的輸出參數返回錯誤的順序。所以,如果你沒有關於輸出的信息 - 你無法正確處理它。正如我發現的,這是因爲在JdbcTemplate#extractOutputParameters中使用HashMap來收集輸出(而不是LinkedHashMap,其中條目的順序與插入順序相同)。

我知道我可以明確定義輸出,但是我沒有這樣的信息,這個方法應該可以和任何傳入的存儲過程一起工作。另外,我知道有可能使用StoredProcedure,但是會有相同的問題,因爲它使用相同的JdbcTemplate方法。

目前,作爲臨時解決方案,我從數據庫元數據和映射返回的值中檢索有關輸出(名稱和序號位置)的信息。

有沒有人遇到過這個問題,您的解決方案是什麼?

回答

0

你正在使用哪個版本的spring-jdbc?如果>=4.2然後有你的嘗試命名參數?使用4.2.1

jdbcTemplate.call(new CallableStatementCreator() { 
@Override 
    CallableStatement createCallableStatement(Connection con) throws SQLException { 
     CallableStatement stmnt = con.createCall("{foo(?, ?, ?)}"); 

     stmnt.registerOutParameter("id", Types.INTEGER); 
     stmnt.setString("name", "somevalue"); 
     stmnt.setDate("description", "anothervalue"); 

     return stmnt; 
    } 
... 
} 
+0

林:

輸出參數可以註冊這樣。據我所知,命名參數只用於輸入參數。我錯了嗎? –

+0

我已經應用了我們用於輸出參數的codesample。 – tillias

+0

在您的解決方案中,我仍然需要知道輸出參數的名稱 –