无法在 Kotlin 中使用 jooq UpdateQuery 在数据库中将非字符串值设置为 null

Posted

技术标签:

【中文标题】无法在 Kotlin 中使用 jooq UpdateQuery 在数据库中将非字符串值设置为 null【英文标题】:Can't set a nonstring value to null in database with jooq UpdateQuery in Kotlin 【发布时间】:2021-11-10 19:14:59 【问题描述】:

(类似于this,但这次它知道是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() 来解决它。

【问题讨论】:

【参考方案1】:

如果您使用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?)

【讨论】:

以上是关于无法在 Kotlin 中使用 jooq UpdateQuery 在数据库中将非字符串值设置为 null的主要内容,如果未能解决你的问题,请参考以下文章

无法在 Kotlin 中使用 jooq UpdateQuery 在数据库中将非字符串值设置为 null

使用 Gradle Kotlin DSL 配置 Jooq 时如何修复“未解析的引用:jdbc”

jOOQ 3.15.1 新的 ad-hoc 转换 API 是不是在 Kotlin 中工作?

springboot+kotlin+gradle+jooq的学习笔记

springboot+kotlin+gradle+jooq的学习笔记

带有 Gradle 和 Kotlin 的 JOOQ 不生成文件