我有一对夫妇的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版本。
这是一个评论太长。我不知道你是如何得出结论,在查询中- 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。它是在它不能运行查询指示错误。您应该检查来从数据库中回过头来看看发生了什么错误。