无法使用 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?)