Передача параметров класса SimpleJDBCCall

У меня есть хранимая процедура в Y DB, который находится на сервере MYSQL. И когда я пытаюсь вызвать его, он выдает ошибку:

com.mysql.jdbc.exceptions.jdbc4.MySQLSyntaxErrorException: неверное количество аргументов для PROCEDURE thu.productGetter; ожидаемое 2, получено 0 в org.springframework.jdbc.support.SQLExceptionSubclassTranslator.doTranslate(SQLExceptionSubclassTranslator.java:95) в org.springframework.jdbc.support.AbstractFallbackSQLExceptionTrans.raj.jj.jp_jl_jl_tj_tj_tj_tj_tj_tj_tj_tj) support.AbstractFallbackSQLExceptionTranslator.translate (AbstractFallbackSQLExceptionTranslator.java:81) в org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:1137) в org.springfraj.j.j.cj.cj.cj.jc.jc.jc.jc.jc.jc.cj.cj.cj.cj.cj.cj.cj.cj.jcc.jp.jcc.jp.jcc.jp.jcc.jp.jcc.jp.jc.cr.jp.jcc.jp.jp.jp.jp.jp.jp.jp.jp.jp.jp.jp.jp.jp.jp.jp.dll.jp.jp.jp.jp.jp.jp.jp.jpj.jp.jpj.jpj.jpj.jpj.jp) в org.springframework.jdbc.core.simple.AbstractJdbcCall.executeCallInternal(AbstractJdbcCall.java:378) в org.springframework.jdbc.core.simple.AbstractJdbcCall.doExecute(AbstractJdbc3).

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);

И код БД хранимой процедуры:

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

Я проверил множество примеров и не смог найти решения своей проблемы.

Есть идеи?

3 ответа

У меня возникла та же проблема после обновления с 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);

У меня было то же сообщение о пропущенных параметрах, но оказалось, что это было неправильное имя схемы

Вместо этого вы можете попробовать 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);
Другие вопросы по тегам