使用 JOOQ 更新 SQLITE 中的表行失败

Posted

技术标签:

【中文标题】使用 JOOQ 更新 SQLITE 中的表行失败【英文标题】:Failed To Update Table Row in SQLITE Using JOOQ 【发布时间】:2019-01-06 13:43:10 【问题描述】:

jooq 正在为 sqlite 数据库生成无效的更新语句。

这是数据库表。

CREATE TABLE "job" (
  `id` integer PRIMARY KEY AUTOINCREMENT, 
  `addressId` text,
   `log` text
)

有效声明:

update "job" set "log" = (coalesce("log", ?) || ? || ?) WHERE id > 0

Jooq 生成的语句

update "job" set "job"."log" = (coalesce("job"."log", ?) || ? || ?) where "job"."id" >= ?

这是我正在使用的示例代码:

DSL.using(configuration).update(JOB).set(JOB.LOG, DSL.coalesce(JOB.LOG, "")
                .concat("char(10)", "Hello"))
                .where(JOB.ID.ge(0)).execute()

如何强制 jooq 生成有效的 sqlite 更新语句?

【问题讨论】:

您是否正确设置了configurationSQLDialect.SQLITE?另外,你为什么给JOB 表起别名? 是的,我配置了相同的方言。能够成功查询数据库但更新失败。我忘记删除别名了,现在更新了。 我无法重现这个。使用正确配置的配置,SQLite 的更新语句中没有列限定,也没有引用列。您能否展示一下您是如何创建configuration 的? 感谢 Lukas Eder 抽出宝贵时间,不幸的是,由于某种原因,这是一个 IDE 问题,在我添加 SQLDialect.SQLITE 的位置没有刷新文件。在将 DIALECT 打印到控制台后,我知道了这一点。 【参考方案1】:

对此最可能的解释是您没有使用SQLDialect.SQLITE 方言正确配置您的configuration。在该方言中,set 子句中的列引用不会被限定,任何列或表也不会被引用。

【讨论】:

我昨天在您发表评论后重新检查过,但没有明确调试问题。

以上是关于使用 JOOQ 更新 SQLITE 中的表行失败的主要内容,如果未能解决你的问题,请参考以下文章

按顺序用 sqlite 数据库中的表行填充表视图部分

从另一个单独的表行更新一个表行[重复]

使用 JOOQ 更新 PostgreSQL 中的 jsonb 值

更新可能包含没有目标的 href 的表行的值

当current_value与使用它的表行不同步时,更新SQL Server中序列的current_value

更新已检查的表行