无法在 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的学习笔记