simpleJDBCTemplate不替换quoted参数

时间:2010-07-19 14:14:11

标签: java spring jdbc

我使用simpleJDBCTemplate将值插入postgre数据库。

String sql "insert into testTable values(:bla, :blah, functionThatTakesAText(':blu'))"
BeanPropertySqlParameterSource namedParameters = new BeanPropertySqlParameterSource(lighting);
simpleJdbcTemplate.update(sql, namedParameters);

现在,blu参数实际上是一个从客户端给出的文件中读取的数字(实际的sql需要2个实数)。

结果,数据库收到如下内容:

insert into testTable values(?, ?, functionThatTakesAText(':blu'))

并且无法按预期更换:blu参数。

我正在使用的当前解决方法是使用正则表达式将blu参数替换为其值,但我不确定它的安全性。

你会如何解决这个问题?

1 个答案:

答案 0 :(得分:2)

Spring会跳过SQL中引号内的任何内容(参见skipCommentsAndQuotes()的{​​{1}}方法),因为不应该触及引号内的任何内容。

在这种情况下这是有意义的 - 你希望准备好的陈述说出

NamedParameterUtils

而不是

functionThatTakesAText(?)

尝试删除那里的引号,并且应该正确替换占位符。