Java 使用PreparedStatement设置H2中的日期/时间值

Java 使用PreparedStatement设置H2中的日期/时间值,java,jdbc,h2,Java,Jdbc,H2,我想不出是什么问题。这里所做的工作与任何其他数据库都没有什么不同,但尝试使用H2(v1.3.176)完全不是运气。表格如下: CREATE TABLE AccessesByMinute ( Count INT NOT NULL, UrlID BIGINT NOT NULL, ServerID BIGINT NOT NULL, RemoteIP VARCHAR(50) NOT NULL, Longitude FLOAT, Latitude FLOAT, Moment D

我想不出是什么问题。这里所做的工作与任何其他数据库都没有什么不同,但尝试使用H2(v1.3.176)完全不是运气。表格如下:

CREATE TABLE AccessesByMinute (
  Count INT NOT NULL,
  UrlID BIGINT NOT NULL,
  ServerID BIGINT NOT NULL,
  RemoteIP VARCHAR(50) NOT NULL,
  Longitude FLOAT,
  Latitude FLOAT,
  Moment DATETIME,
  UserID DATETIME
);
代码是:

...
Date timestamp = Utils.getNearest(Calendar.MINUTE, access.getTimestamp());
...
Calendar cal = Calendar.getInstance();
cal.setTimeInMillis(time);
cal.set(Calendar.MILLISECOND, 0);
cal.set(Calendar.SECOND, 0);
....

     try (PreparedStatement ps = con.prepareStatement("INSERT INTO AccessesByMinute (Moment, UserID, UrlID, ServerID, RemoteIP, Longitude, Latitude, Count) VALUES (?, ?, ?, ?, ?, ?, ?, 1)");
      {
        ps.setTimestamp(1, new Timestamp(timestamp.getTime()));
        ps.setLong(2, userId);
        ps.setLong(3, urlId);
        ps.setLong(4, serverId);
        ps.setString(5, access.getRemoteIp());
        ps.setFloat(6, (loc == null ? 0 : loc.longitude));
        ps.setFloat(7, (loc == null ? 0 : loc.latitude));
        ps.executeUpdate();  
      }
并不断得到错误:

org.h2.jdbc.JdbcSQLException:无法解析“TIMESTAMP”常量“1”; SQL语句:

getTime()返回一个long,它是java.sql.timestamp的参数
我没有看到什么?

提供更多的代码,特别是关于
时间戳
变量的代码。修改了问题
UserId
声明为
DATETIME
,我假设应该是
INT
BIGINT
。我猜您应该知道变量
userId
的值是1。@markrotVeel您应该添加它作为答案。我可以重现这个问题,并将
UserId
更改为
int
来修复它。@ThomasMueller我本来可以这样做的,但我选择了关闭主题,因为我认为这对未来的访问者没有帮助。但是,作为H2的开发人员,您可能想考虑为不支持的组合抛出一个显式异常(例如,<代码> SETLION < /代码>不支持时间戳),您可能还需要查看JDBC 4.2规范的附录B以获得所需的/允许的组合。