jOOQ - 支持 UPDATE ... SET ... 任意程度的查询

Posted

技术标签:

【中文标题】jOOQ - 支持 UPDATE ... SET ... 任意程度的查询【英文标题】:jOOQ - support for UPDATE ... SET ... query with arbitrary degree 【发布时间】:2015-11-09 06:49:52 【问题描述】:

我有两个函数:一个返回字段列表,另一个返回选择查询(选择字段的对应值)。

private List<Field<?>> fields() 
    ....


private Select<?> select() 
    ...

请注意,度数是在运行时确定的,它取决于用户输入。因此List&lt;Field&lt;?&gt;&gt;Select&lt;?&gt;

可以插入到表格中:

context.insertInto(table, fields()).select(select()))

无法更新表:

context.update(table).set(DSL.row(fields()), select())

这个功能可以添加到 jOOQ 3.7 吗?

我们现在可以使用哪种解决方法?

【问题讨论】:

类似问题:***.com/q/32251307/521799 【参考方案1】:

很好,UpdateSetFirstStep DSL API 上缺少一个方法,它接受 RowN 作为第一个参数,从 DSL.row(Collection) 返回的类型。这应该为 jOOQ 3.7 修复: https://github.com/jOOQ/jOOQ/issues/4475

作为一种解决方法,如果您可以忍受被黑客入侵的罪恶感,您可以强制转换为原始类型:

context.update(table).set((Row1) DSL.row(fields()), (Select) select())

您可以将DSL.row(fields()) 转换为Row1,因为DSL.row(fields()) 返回的内部实现类型实现了所有Row[N] 类型。

【讨论】:

有罪的黑客使软件工作!感谢您提供信息。 我想我问错了问题。我希望update(table).set(row expression, select query) 被翻译成update table set field_1 = alias.field_1, field_2 = alias.field_2, ... from (select query) as alias。但它被翻译成update table set (field_1, field_2, ...) = (select query),这对PostgreSQL 无效。我应该为此提出一个新问题吗? @KevinDeGrote:翻译看起来很有趣。也许我们可以为旧版本的 PostgreSQL 实现这一点。另一方面,PostgreSQL 9.5 现在支持这种标准语法:postgresql.org/docs/9.5/static/sql-update.html。 jOOQ 支持UPDATE .. FROM。如果你不能让它工作,请随时问另一个问题。我会在附近:) 我会试试的。这里唯一的问题是我认为我不能以流利的风格写这个(因为我必须为每个字段写.set(field, value))。我从List&lt;Field&lt;?&gt;&gt;Select&lt;?&gt; 开始。不过这没什么大不了的。 甚至不需要映射。这很好用:context.update(table).set((Row1) DSL.row(fields()), (Row1) select().fieldsRow()).from(select())。感谢您的反馈意见!在 jOOQ 3.7 中,我应该删除 (Row1) 演员表。

以上是关于jOOQ - 支持 UPDATE ... SET ... 任意程度的查询的主要内容,如果未能解决你的问题,请参考以下文章

使用绑定变量的jooq查询

使用 JOOQ 更新 PostgreSQL 中的 jsonb 值

使用JOOQ无法在SQLITE中更新表行

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

JOOQ 乐观锁定和 DataChangedException:数据库记录已在 record.update 上更改

如何使用多种“设置”方法创建“更新”