SQLServerException:使用NamedParameterJdbcTemplate

时间:2019-02-08 11:25:25

标签: java sql sql-server spring jdbc

当我使用 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“ [...]索引1超出范围[...]”

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

更新

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

1 个答案:

答案 0 :(得分:0)

这个评论太长了。我看不出您如何断定查询中的- 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 引起的。这表明查询中无法运行的错误。 您应该检查从数据库返回的错误,看看发生了什么。