【问题标题】:Spring NamedParameterJdbcTemplate issue with division and parameter in MSSqlServerSpring NamedParameterJdbcTemplate 问题与 MSSqlServer 中的除法和参数有关
【发布时间】:2020-01-03 02:06:41
【问题描述】:

我正在使用带有单个参数的NamedParameterJdbcTemplate 执行以下查询。

表的 DDL

create table TEST_TRANS
(
    DESCRIPTION_2 float,
    AMOUNT_STR varchar(255),
    DESCRIPTION varchar(255)
)

SQL

UPDATE TEST_TRANS
    SET DESCRIPTION_2 = CAST(AMOUNT_STR as float) / 100
WHERE 
    DESCRIPTION != :DESCRIPTION

当我使用

执行查询时
Objects.requireNonNull(getNamedParameterJdbcTemplate())
                .update(testQuery, Collections.singletonMap("DESCRIPTION","AED"));

我收到以下错误。

Exception in thread "main" org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [UPDATE TEST_TRANS SET DESCRIPTION_2 = CAST(AMOUNT_STR as float)/100 WHERE DESCRIPTION != ?]; The index 1 is out of range.; nested exception is com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range.
    at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:110)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:72)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81)
    at org.springframework.jdbc.core.JdbcTemplate.translateException(JdbcTemplate.java:1442)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:632)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:861)
    at org.springframework.jdbc.core.JdbcTemplate.update(JdbcTemplate.java:882)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:320)
    at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.update(NamedParameterJdbcTemplate.java:325)
    at com.seenukarthi.so.jdbctest.repository.TestJdbcRepository.test(TestJdbcRepository.java:32)
    at com.seenukarthi.so.jdbctest.service.TestJdbcService.testService(TestJdbcService.java:19)
    at com.seenukarthi.so.jdbctest.Main.main(Main.java:12)
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: The index 1 is out of range.
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:228)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:1124)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setValue(SQLServerPreparedStatement.java:1138)
    at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setString(SQLServerPreparedStatement.java:1683)
    at org.springframework.jdbc.core.StatementCreatorUtils.setValue(StatementCreatorUtils.java:400)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValueInternal(StatementCreatorUtils.java:232)
    at org.springframework.jdbc.core.StatementCreatorUtils.setParameterValue(StatementCreatorUtils.java:147)
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.setValues(PreparedStatementCreatorFactory.java:286)
    at org.springframework.jdbc.core.PreparedStatementCreatorFactory$PreparedStatementCreatorImpl.createPreparedStatement(PreparedStatementCreatorFactory.java:244)
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:614)
    ... 7 more

如果我删除 SQL 的 /100,一切正常。另外,如果我对参数进行硬编码,它正在工作

环境:

  1. Ubuntu 中的 MSSql Server 2017。
  2. macOS 中的应用服务器码头
  3. Java openjdk 版本“1.8.0_222”

转载者可以在GitHub找到

【问题讨论】:

  • 你能显示执行更新的代码吗?
  • @Karthikeyan Vaithilingam,你能提供你的java代码和你的环境,比如操作系统版本、java、mssql等吗?
  • @John 我无法分享实际代码,我将创建一个复制器并更新问题。
  • @John 我已经添加了复制器。
  • @KarthikeyanVaithilingam 愚蠢的解决方法 - 如果将 /100 替换为 *0.01 会发生什么?

标签: java sql-server spring spring-jdbc


【解决方案1】:

经过一番研究,我发现问题出在 JDBC 驱动程序 mssql-jdbc 版本 7.2.0。将驱动升级到最新版本后问题解决了

BUG Report for GitHub

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2015-01-19
    • 2016-10-21
    • 2013-02-23
    • 1970-01-01
    • 2015-06-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多