【发布时间】:2016-09-01 19:58:48
【问题描述】:
如何使用 JOOQ 将 Double.NaN 插入 PostgreSQL“双精度”字段?
我正在使用 PostgreSQL 9.5 和 JOOQ 3.7.3。我将传感器值批量插入表中。有时值是 NaN,当 JOOQ 尝试插入它时,它会抛出异常。
org.springframework.jdbc.BadSqlGrammarException: jOOQ; bad SQL grammar [];
nested exception is java.sql.BatchUpdateException: Batch entry 6
insert into "sensordata" ("measure_time", "location_id", "sensor_id", "value")
values (1462551000, 12, 15, NaN)
on conflict ("measure_time", "location_id", "sensor_id")
do update set "value" = NaN
was aborted.
Call getNextException to see the cause.
at org.springframework.jdbc.support.SQLStateSQLExceptionTranslator.doTranslate(SQLStateSQLExceptionTranslator.java:99) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:73) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
at org.springframework.jdbc.support.AbstractFallbackSQLExceptionTranslator.translate(AbstractFallbackSQLExceptionTranslator.java:81) ~[spring-jdbc-4.2.5.RELEASE.jar:4.2.5.RELEASE]
值字段在 SQL 中定义如下:"value" DOUBLE PRECISION NOT NULL DEFAULT 0.0
我的 Java 代码的相关部分:
final List<InsertOnDuplicateSetMoreStep<SensordataRecord>> inserts =
seq(list)
.map(this::process)
.flatMap(t -> t)
.map(d ->
sql.insertInto(SENSORDATA, SENSORDATA.MEASURE_TIME, SENSORDATA.LOCATION_ID, SENSORDATA.SENSOR_ID, SENSORDATA.VALUE)
.values(d.getMeasureTime(), d.getLocationId(), d.getSensorId(), d.getValue())
.onDuplicateKeyUpdate()
.set(SENSORDATA.VALUE, d.getValue())
)
.toList();
sql.transaction(cfg -> DSL.using(cfg).batch(inserts).execute());
【问题讨论】:
-
问题在于批量插入,在我将其替换为
inserts.forEach(query -> DSL.using(cfg).execute(query));后,事务运行正常。也许我应该将问题更改为:“为什么使用 onDuplicateKeyUpdate 子句时批量插入失败?”,但我不确定这是否是我的查询的真正问题。
标签: postgresql double nan jooq