【问题标题】:simpleJDBCTemplate not replacing quoted parametersimpleJDBCTemplate 不替换带引号的参数
【发布时间】:2010-07-19 14:14:10
【问题描述】:

我正在使用 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 参数替换为其值,但我不确定这有多安全。

你会怎么解决这个问题?

【问题讨论】:

    标签: java spring jdbc


    【解决方案1】:

    Spring 将跳过 SQL 中引号内的任何内容(参见 NamedParameterUtilsskipCommentsAndQuotes() 方法),因为引号内的任何内容都不应被触及。

    在这种情况下这是有道理的 - 你会希望准备好的语句说

    functionThatTakesAText(?)
    

    而不是

    functionThatTakesAText('?')
    

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

    【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-03-18
    • 1970-01-01
    • 2019-07-01
    • 1970-01-01
    • 2019-01-21
    • 1970-01-01
    • 2019-08-09
    相关资源
    最近更新 更多