无法使用 Kotlin 中的 jooq UpdateQuery 在数据库中将非字符串值设置为 null
Can't set a nonstring value to null in database with jooq UpdateQuery in Kotlin
(类似于,但这次它知道它是POSTGRES。)
我有一个更新查询:
val uq = kontxt.updateQuery(table("felhaszn"))
uq.addValue(field("kilepett"), null as Timestamp?
并生成 (println(uq.getSQL())
):
update felhaszn set /*...*/ kilepett = cast(? as varchar) /*...*/
为什么是 varchar?
在 uq.execute()
它抛出一个
ERROR: column "kilepett" is of type timestamp without time zone but expression is of type character varying
而 println(uq.toString())
的输出显示正确的 SQL。所以我可以通过 kontxt.query(uq.toString()).execute()
而不仅仅是 uq.execute()
.
来解决它
如果您使用 code generator,就不会发生这种情况,在这种情况下,您的列会附加类型信息,并且 jOOQ 可以绑定正确的类型:
val uq = kontxt.updateQuery(FELHASZN)
uq.addValue(FELHASZN.KILEPETT, null as Timestamp?)
您对 Timestamp?
的强制转换在这里无济于事,因为 JVM 在运行时不维护该类型信息。 null
引用没有类型,您的 field("kilepett")
也没有附加任何类型信息(它是 Field<Object?>
)。如果由于某种原因您无法使用代码生成器(我强烈建议您使用!),您必须明确附上此信息:
uq.addValue(field("kilepett", SQLDataType.TIMESTAMP), null as Timestamp?)
(类似于
我有一个更新查询:
val uq = kontxt.updateQuery(table("felhaszn"))
uq.addValue(field("kilepett"), null as Timestamp?
并生成 (println(uq.getSQL())
):
update felhaszn set /*...*/ kilepett = cast(? as varchar) /*...*/
为什么是 varchar?
在 uq.execute()
它抛出一个
ERROR: column "kilepett" is of type timestamp without time zone but expression is of type character varying
而 println(uq.toString())
的输出显示正确的 SQL。所以我可以通过 kontxt.query(uq.toString()).execute()
而不仅仅是 uq.execute()
.
如果您使用 code generator,就不会发生这种情况,在这种情况下,您的列会附加类型信息,并且 jOOQ 可以绑定正确的类型:
val uq = kontxt.updateQuery(FELHASZN)
uq.addValue(FELHASZN.KILEPETT, null as Timestamp?)
您对 Timestamp?
的强制转换在这里无济于事,因为 JVM 在运行时不维护该类型信息。 null
引用没有类型,您的 field("kilepett")
也没有附加任何类型信息(它是 Field<Object?>
)。如果由于某种原因您无法使用代码生成器(我强烈建议您使用!),您必须明确附上此信息:
uq.addValue(field("kilepett", SQLDataType.TIMESTAMP), null as Timestamp?)