Java 使用PreparedStatement设置H2中的日期/时间值
我想不出是什么问题。这里所做的工作与任何其他数据库都没有什么不同,但尝试使用H2(v1.3.176)完全不是运气。表格如下: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
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以获得所需的/允许的组合。