当我使用 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版中解决。
答案 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 引起的。这表明查询中无法运行的错误。 您应该检查从数据库返回的错误,看看发生了什么。