Я использую simpleJDBCTemplate для вставки значения в postgre базу данных.
String sql "insert into testTable values(:bla, :blah, functionThatTakesAText(':blu'))"
BeanPropertySqlParameterSource namedParameters = new BeanPropertySqlParameterSource(lighting);
simpleJdbcTemplate.update(sql, namedParameters);
Теперь, blu параметр является на самом деле числом (фактический sql берет 2 real's), который читается из файла, данного клиентом.
В результате база данных получает что-то как следующее:
insert into testTable values(?, ?, functionThatTakesAText(':blu'))
и сбои для замены: параметр blu как ожидалось.
Текущее обходное решение, которое я использую, заменяет blu параметр своим значением с помощью regex, но я не уверен о том, как безопасный, который является.
Как Вы решили бы это?
Spring пропустит все, что находится внутри кавычек в SQL (см. Метод skipCommentsAndQuotes ()
из NamedParameterUtils
), на основании того, что все, что находится внутри кавычек не следует трогать.
Это имеет смысл в данном контексте - вы бы хотели, чтобы в подготовленном операторе говорилось
functionThatTakesAText(?)
, а не
functionThatTakesAText('?')
. Попробуйте удалить там кавычки, и заполнитель должен быть заменен правильно.