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 服务器端求值的表达式。