SimpleJDBCCall 类参数传递

Ner*_*ron 2 java spring stored-procedures jdbctemplate

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

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException:PROCEDURE thu.productGetter 的参数数量不正确;预期为2,在org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:95)在org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73)在org.springframework.jdbc得到0。 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);
Run Code Online (Sandbox Code Playgroud)

存储过程数据库代码是:

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

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

有任何想法吗?

ale*_*oot 5

从 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);
Run Code Online (Sandbox Code Playgroud)