Spring SimpleJdbcCall返回错误的值

时间:2014-09-30 15:16:39

标签: java spring spring-jdbc

我使用SimpleJdbcCall调用存储过程。

    public Map<String, Object> callStoredProcedure(SimpleJdbcCall jdbcCall, String procedureName, Map<String, Object> inParamMap) {
        log.info("Calling stored procedure with name : " + procedureName);
        SqlParameterSource in = new MapSqlParameterSource(inParamMap);
        Map<String, Object> out = jdbcCall.withProcedureName(procedureName).execute(in);
        return out;
}

其结果输出为

  

Key =#result-set-1,Value = [{= 17.00}]

当我得到像这样的类类型值时,我感到很困惑。

  

Class class1 = entry.getValue()。getClass();

当我在数据库上执行时,我的sp返回17.00,但我在jdbcCall代码中得到 = 17.00

任何评论都会有所帮助。

4 个答案:

答案 0 :(得分:1)

以下是我如何从之前的项目构建SimpleJdbcCall ....

createUpdateUsersSP = new SimpleJdbcCall(contactManagerJdbcT)
                .withProcedureName(pb.getCreateUpdateUsersSp())
                .declareParameters(
                        new SqlOutParameter("p_user_id", Types.NUMERIC),
                        new SqlOutParameter("p_update_stamp", Types.VARCHAR),
                        new SqlOutParameter("p_status", Types.VARCHAR),
                        new SqlOutParameter("p_failure_reason", Types.VARCHAR),
                        new SqlParameter("p_vonage_id", Types.VARCHAR),
                        new SqlParameter("p_mobile_did", Types.VARCHAR),
                        new SqlParameter("p_email_address", Types.VARCHAR),
                        new SqlParameter("p_name", Types.VARCHAR),
                        new SqlParameter("p_netname_id", Types.NUMERIC),
                        new SqlParameter("p_user_status", Types.VARCHAR),
                        new SqlParameter("p_image_update_stamp", Types.TIMESTAMP),
                        new SqlParameter("p_has_profile_image", Types.VARCHAR),
                        new SqlParameter("p_nick_name", Types.VARCHAR));
        createUpdateUsersSP.setAccessCallParameterMetaData(false);

你有类似的东西可以告诉我们吗?

答案 1 :(得分:1)

显然,您的商店程序仅返回单个结果,但execute JdbcCall方法尝试返回输出参数的地图,按名称键入参数声明。由于您没有参数声明,因此只有ResultSet只包含行,没有列名和单个值17.00

我认为您应该使用executeObject 将单个输出参数作为指定返回类型的对象返回。

String str = jdbcCall.withProcedureName(procedureName).executeObject(String.class, in);

double val = jdbcCall.withProcedureName(procedureName).executeObject(Double.class, in);

答案 2 :(得分:0)

这是我要提取值的工作,因为我看不到该问题的任何可行答案。

((Map)((List)out.get("#result-set-1")).get(0)).get("");

这给出了out参数中的值。

答案 3 :(得分:0)

这是我的工作。

Map<String,Object> simpleJdbcCallResult = simpleJdbcCall.execute(sqlParameterSource);

LinkedCaseInsensitiveMap<?> obj = 
(LinkedCaseInsensitiveMap<?>)((List<?>)simpleJdbcCallResult.get("#result-set-1")).get(0);

Array[] values = (Array[]) obj.values().toArray()[0];