Caused by: org.h2.jdbc.JdbcSQLDataException: 无法解析 "TIMESTAMP" 常量
Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "TIMESTAMP" constant
我在测试环境中遇到了一个简单的请求 H2 的小问题,如下所示:
异常:
Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "TIMESTAMP" constant ":localDateTime"
String query="select * from Article E1 WHEN E1.date> " + "':localDateTime'" "
namedParameterJdbcTemplate.queryForObject(query, mapParameters(), Object.class);
private MapSqlParameterSource mapParameters() {
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("localDateTime", Timestamp.valueOf(LocalDateTime.now().format(dtf1)), TIMESTAMP);
}
您的问题是命名参数两边的引号。
+ "':localDateTime'"
应该是
+ ":localDateTime"
JDBC 准备好的语句参数在文字中无法识别。所以 H2 看到一个看起来像 ':localDateTime'
的日期文字,它不被识别为有效日期。
我找不到这方面的明确参考(例如在 JDBC 规范中)但是准备好的语句参数只能用于 SQL 其中一个(完整的)SQL 值是必须的;例如表达式或 sub-expression。您不能在文字中使用参数,也不能参数化列名或 table 名称。而且您不能使用一个来注入要在 SQL 服务器端求值的表达式。
我在测试环境中遇到了一个简单的请求 H2 的小问题,如下所示:
异常:
Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "TIMESTAMP" constant ":localDateTime"
String query="select * from Article E1 WHEN E1.date> " + "':localDateTime'" "
namedParameterJdbcTemplate.queryForObject(query, mapParameters(), Object.class);
private MapSqlParameterSource mapParameters() {
DateTimeFormatter dtf1 = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm:ss");
MapSqlParameterSource parameters = new MapSqlParameterSource();
parameters.addValue("localDateTime", Timestamp.valueOf(LocalDateTime.now().format(dtf1)), TIMESTAMP);
}
您的问题是命名参数两边的引号。
+ "':localDateTime'"
应该是
+ ":localDateTime"
JDBC 准备好的语句参数在文字中无法识别。所以 H2 看到一个看起来像 ':localDateTime'
的日期文字,它不被识别为有效日期。
我找不到这方面的明确参考(例如在 JDBC 规范中)但是准备好的语句参数只能用于 SQL 其中一个(完整的)SQL 值是必须的;例如表达式或 sub-expression。您不能在文字中使用参数,也不能参数化列名或 table 名称。而且您不能使用一个来注入要在 SQL 服务器端求值的表达式。