SQLServerException:“[...]的索引1超出范围[...]”使用时是NamedParameterJdbcTemplate

问题描述 投票:0回答:1

我有一对夫妇的SQL语句的问题,当我使用的是NamedParameterJdbcTemplate(MSSQL-JDBC 7.2.0)。

例:

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超出范围[...]”被提升。

也许一些保留的炭导致的吗?

更新:

从7.2.0降级弹簧JDBC到7.0.0后,我的代码工作正常。如此看来,新版本与解析SQL语句的一些问题。看看https://github.com/Microsoft/mssql-jdbc/issues/952。该问题将与7.2.1版本。

java sql sql-server spring jdbc
1个回答
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。它是在它不能运行查询指示错误。您应该检查来从数据库中回过头来看看发生了什么错误。

© www.soinside.com 2019 - 2024. All rights reserved.