Передача параметров класса 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);