Spring:存储过程输出参数以错误的顺序返回

时间:2015-10-08 20:14:32

标签: java spring stored-procedures jdbc jdbctemplate

我正在使用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方法会出现同样的问题。

目前,作为临时解决方案,我从数据库元数据中检索有关输出(名称和序号位置)的信息,并映射关于此的返回值。

有没有人遇到这个问题,你的解决方案是什么?

1 个答案:

答案 0 :(得分:0)

您使用的是哪个版本的spring-jdbc?如果>=4.2然后有你尝试过的命名参数?

输出参数可以这样注册:

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;
    }
...
}