使用 jOOQ UPserting 到 Postgres 表时返回更新的行数

Posted

技术标签:

【中文标题】使用 jOOQ UPserting 到 Postgres 表时返回更新的行数【英文标题】:Returning count of updated rows when UPserting to a Postgres table using jOOQ 【发布时间】:2020-01-21 08:18:48 【问题描述】:

我正在使用 jOOQ 的 insertInto()onDuplicateKeyUpdate() 方法将一些数据更新到 Postgres 表中。我以后想知道我的数据中有多少重复项,因此如果一行被插入或更新,则需要返回。

到目前为止,从我的 postgres 特定的research 来看,我发现RETURNING (not MY_TABLE.xmax = 0) AS updated 是一个有效的选项。但是,jOOQ 自动生成的 Java 表类似乎无法让我访问 postgres 的系统列,例如 xmax。

这是我目前的查询:

dsl.insertInto(MY_TABLE)
        .columns(
                // pkey columns
                MY_TABLE.SHIFT,
                MY_TABLE.DATE_UTC,
                MY_TABLE.TIME_UTC,

                MY_TABLE.DURATION,
        )
        .values(
                shiftId,
                utcDateId,
                utcTime,
                duration
        )
        .onDuplicateKeyUpdate()
        .set(MY_TABLE.DURATION, newDuration)
        .returning((MY_TABLE.xmax = 0).`às`("inserted"))
        .execute()

这会导致以下编译时错误:

错误:Kotlin:未解析的引用:XMAX

我已经重新检查了我的 Maven jOOQ 表生成配置,并且我没有排除任何列。我还通读了在 jOOQ 自己的网站上可以找到的所有内容,但没有找到针对此特定用例的有用信息。

关于我可以在这里做什么的任何提示?

【问题讨论】:

【参考方案1】:

在这种情况下,您应该使用 jOOQ 的 SQL templating。具体看DSL.field()方法。像这样的东西:field("my_table.xmax", int.class).eq(0)

【讨论】:

以上是关于使用 jOOQ UPserting 到 Postgres 表时返回更新的行数的主要内容,如果未能解决你的问题,请参考以下文章

Promise 和 upserting 到数据库

如何使用 jOOQ fetchInto() 映射到现有的 Hibernate 模型?

JOOQ 插入到具有大量记录的选择中

使用jooq上下文将内存sqlite转储到字节[]

JOOQ - 更新新添加的列

将 jooq 中的获取/结果映射到特定记录