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<Field<?>>
和Select<?>
。
可以插入到表格中:
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<Field<?>>
和Select<?>
开始。不过这没什么大不了的。
甚至不需要映射。这很好用:context.update(table).set((Row1) DSL.row(fields()), (Row1) select().fieldsRow()).from(select())
。感谢您的反馈意见!在 jOOQ 3.7 中,我应该删除 (Row1)
演员表。以上是关于jOOQ - 支持 UPDATE ... SET ... 任意程度的查询的主要内容,如果未能解决你的问题,请参考以下文章
使用 JOOQ 更新 PostgreSQL 中的 jsonb 值