【问题标题】:SQLServerException: "[...] The index 1 is out of range [...]" when using NamedParameterJdbcTemplateSQLServerException: "[...] The index 1 is out of range [...]" when using NamedParameterJdbcTemplate
【发布时间】:2019-02-08 11:25:24
【问题描述】:

当我使用 NamedParameterJdbcTemplate (mssql-jdbc 7.2.0) 时,我遇到了几个 sql 语句的问题。

例子:

return jdbcTemplate.query("SELECT Mitarbeiter, CASE "+
        " WHEN Storno = 1 THEN Dauer * -1 "+
        " WHEN Storno = 0 THEN Dauer " +
        " END AS Wert "+
        "FROM Werte " +
        "WHERE Mitarbeiter IN (:mitarbeiter)", parameterSource, rs -> {
    HashMap<String, Integer> hashMap = new HashMap<>();
    while (rs.next()) {
        hashMap.put(rs.getString("Mitarbeiter"), rs.getInt("Wert"));
    }
    return hashMap;
});

当我在 SQL Server Management Studio 中执行 sql 语句时,它工作正常。但是,当我使用 jdbcTemplate 执行语句时,会引发 SQLServerException "[...] The index 1 is out of range [...]"

也许是某些保留字符导致了问题?

更新:

将 spring-jdbc 从 7.2.0 降级到 7.0.0 后,我的代码工作正常。似乎新版本在解析 sql 语句方面存在一些问题。看看https://github.com/Microsoft/mssql-jdbc/issues/952。该问题将在 7.2.1 版本中修复。

【问题讨论】:

  • 您可以将Dauer * -1 替换为-Dauer

标签: java sql sql-server spring jdbc


【解决方案1】:

评论太长了。我不明白您是如何断定查询中的 - 1 是您的问题的原因。

这个查询没问题:

SELECT Mitarbeiter,
       (CASE WHEN Storno = 1 THEN Dauer * -1 
             WHEN Storno = 0 THEN Dauer 
        END) AS Wert 
FROM Werte 
WHERE Mitarbeiter IN (:mitarbeiter);

这样写会更简单:

       (CASE WHEN Storno = 1 THEN - Dauer
             WHEN Storno = 0 THEN Dauer 
        END) AS Wert 

或者如果Storno只取0和1的值:

(1 - 2 * Storno) * Dauer as Wert

我怀疑* -1 是你的问题,除非字符串中有不寻常的字符。

索引 1 超出范围错误是由于 java 而不是 SQL。它表示无法运行的查询中的错误。 您应该检查从数据库返回的错误以了解发生了什么。

【讨论】:

  • 因为当我省略 -1 时,代码可以正常工作(不管值不正确)。此外,我将 MapSqlParameterSource 用于 mitarbeiter 参数,并且此类可以将 List 作为参数处理。
猜你喜欢
  • 1970-01-01
  • 2015-05-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-04-27
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多