时间戳列不接受java.time.Instant,错误代码GS_ERROR_DATA_TYPE_MISMATCH

后端开发 2026-07-08

我正在使用GridDB Java客户端API向一个包含 TIMESTAMP 列的容器中插入记录。

环境信息

* GridDB Cloud
* GridDB Java Client API: `<version>`
* Java: `<version>`
* Container Type: Collection

容器结构

CREATE TABLE sensor_data (
    ts TIMESTAMP,
    sensor_id STRING,
    temperature DOUBLE,
    PRIMARY KEY(ts)
);

Java代码

ContainerInfo containerInfo = store.getContainerInfo("sensor_data");
Container<?, Row> container = store.getContainer("sensor_data");

Row row = container.createRow();

row.setTimestamp(0, Instant.now());
row.setString(1, "sensor-01");
row.setDouble(2, 26.5);

container.put(row);

错误信息

在执行 container.put(row) 时出现异常:

com.toshiba.mwcloud.gs.GSException:
[145002:GS_ERROR_DATA_TYPE_MISMATCH]
Cannot assign value to TIMESTAMP column

ts 被定义为 TIMESTAMP,因此我期望由 Instant.now() 返回的值能够被接受。不过,API抛出数据类型不匹配错误。

我也验证了列索引 0 对应于 TIMESTAMP 列,容器结构已正确创建;如果没有为时间戳字段赋值,错误会消失,且其他字段(STRINGDOUBLE)能够成功插入。

我还发现有使用 java.util.Datejava.sql.Timestamp 的示例,但没有找到关于对 java.time.Instant 的支持的明确文档。

问题

GridDB Java API是否支持将 java.time.Instant 直接插入到 TIMESTAMP 列中?如果不支持,推荐的做法是什么?在插入前是否需要对该值进行转换,例如:

row.setTimestamp(
    0,
    java.sql.Timestamp.from(Instant.now())
);

还是应该改用 java.util.Date

我想了解 Row.setTimestamp() 官方支持哪些Java时间戳类型,以及在使用Java 8+ Date/Time API时,TIMESTAMP 列应如何填充。

解决方案

该API仅接受 java.util.Date,不接受 java.time.Instant

row.setTimestamp(0, Date.from(Instant.now()));

那应该能解决问题。java.sql.Timestamp 也能工作,因为它继承自 java.util.Date,但Date.from更简洁。

站内所有文章版权归属LeftHeroAI导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。

相关文章