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 类参数传递的主要内容,如果未能解决你的问题,请参考以下文章