SimpleJDBCCall 类参数传递

Posted

技术标签:

【中文标题】SimpleJDBCCall 类参数传递【英文标题】:SimpleJDBCCall class parameter passing 【发布时间】:2014-05-27 17:48:12 【问题描述】:

我在 mysql 服务器上的 y db 中有一个存储过程。当我尝试调用它时,它会给出错误:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:不正确 PROCEDURE thu.productGetter 的参数数量;预期 2,得到 0 在 org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:95) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) 在 org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) 在 org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137) 在 org.springframework.jdbc.core.JdbcTemplate.call(JdbcTemplate.java:1173) 在 org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:378) 在 org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbcCall.java:363)

Java 代码是:

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate())
                                    .withSchemaName("thu")
                                    .withProcedureName("productGetter");

    jdbcCall.addDeclaredParameter(new SqlParameter("maxPrice", Types.DOUBLE));
    jdbcCall.addDeclaredParameter(new SqlParameter("minPrice", Types.DOUBLE));

    Map<String, Object> params=new HashMap<String, Object>();
    params.put("maxPrice", maxPrice);
    params.put("minPrice", minPrice);


    jdbcCall.execute(params);

而存储过程db代码为:

CREATE DEFINER=`root`@`localhost` PROCEDURE `productGetter`(IN maxPrice double,minPrice double)
BEGIN
        ...    
END$$

我检查了很多示例,但找不到任何解决我的问题的方法。

有什么想法吗?

【问题讨论】:

您收到的错误是告诉您您没有传递足够的参数给它。检查您的params Map 中的参数是否设置正确。 它们实际上是说它没有传递任何参数,而不是更少。 启用调试日志记录并在日志中查看传递给存储过程的参数和值。 AbstractJdbcCall.executeCallInternal 有 this kind of logging。 肯定的,我查看了jar的源代码,发现最后callparameters列表是空的。 也可以选择jdbcCall.execute(maxPrice, minPrice); 【参考方案1】:

我从 mysql 5.1 连接器升级到 6.0.6 后遇到了同样的问题,解决的方法就是这样添加:.withoutProcedureColumnMetaDataAccess()

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate())
                                    .withSchemaName("thu")
                                    .withProcedureName("productGetter")
                                    .withoutProcedureColumnMetaDataAccess();

    jdbcCall.addDeclaredParameter(new SqlParameter("maxPrice", Types.DOUBLE));
    jdbcCall.addDeclaredParameter(new SqlParameter("minPrice", Types.DOUBLE));

    Map<String, Object> params=new HashMap<String, Object>();
    params.put("maxPrice", maxPrice);
    params.put("minPrice", minPrice);


    jdbcCall.execute(params);

【讨论】:

【参考方案2】:

我收到了关于缺少参数的相同消息,但结果证明是架构名称错误

【讨论】:

【参考方案3】:

您可以尝试 MapSqlParamterSorce

SimpleJdbcCall jdbcCall = new SimpleJdbcCall(getJdbcTemplate())
                                    .withSchemaName("thu")
                                    .withProcedureName("productGetter")
                                    .withoutProcedureColumnMetaDataAccess();

jdbcCall.addDeclaredParameter(new SqlParameter("maxPrice", Types.DOUBLE));
jdbcCall.addDeclaredParameter(new SqlParameter("minPrice", Types.DOUBLE));

MapSqlParameterSource source = new MapSqlParameterSource();
source.addValue("maxPrice", maxPrice);
source.addValue("minPrice", minPrice);

jdbcCall.execute(source);

【讨论】:

以上是关于SimpleJDBCCall 类参数传递的主要内容,如果未能解决你的问题,请参考以下文章

如何向Webservice里传递类参数

使用 pybind11 将抽象类作为参数作为参数传递

在 Postman 中将类对象作为参数传递

在静态类方法中通过引用传递参数

如何使用 simpleJdbcCall 在存储过程中获取 XML 输出参数

如何在类中将函数作为参数传递?