Home > Net >  Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "TIMESTAMP" constant
Caused by: org.h2.jdbc.JdbcSQLDataException: Cannot parse "TIMESTAMP" constant

Time:05-02

I Faced a little problem with a simple request H2 in test environment that is as follows:

Exception:

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);

}

CodePudding user response:

Your problem is the quotes around the named parameter.

  "':localDateTime'"

should be

  ":localDateTime"

JDBC prepared statement parameters are not recognized inside a literal. So H2 sees a date literal that looks like ':localDateTime' which is doesn't recognize as a valid date.


I cannot find a definitive reference for this (e.g. in the JDBC specs) but prepared statement parameters can only be used in the SQL where a (complete) SQL value is required; e.g. a expression or sub-expression. You cannot use a parameter within a literal, or to parameterize a column name or table name. And you cannot use one to inject an expression to be evaluated on the SQL server side.

  • Related