2015-10-08 50 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

在您的解决方案中,我仍然需要知道输出参数的名称 –