时间戳列不接受java.time.Instant,错误代码GS_ERROR_DATA_TYPE_MISMATCH
我正在使用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 列,容器结构已正确创建;如果没有为时间戳字段赋值,错误会消失,且其他字段(STRING 与 DOUBLE)能够成功插入。
我还发现有使用 java.util.Date 或 java.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导航站,无授权禁止任何主体转载、抄袭、复制内容,亦不得私自架设镜像站点。一经侵权,本站将通过法律途径追责。