如何使用jOOQ更新PostgreSQL复合类型列中的单个子字段?
PostgreSQL复合类型子字段更新对应的jOOQ写法
PostgreSQL 官方给出的更新复合类型子字段的原生SQL示例如下:
UPDATE mytab SET complex_col.r = (complex_col).r + 1 WHERE ...;
对应jOOQ代码基于已完成表结构、UDT复合类型代码生成的前提,有两种实现方式:
jOOQ 3.16及以上版本(推荐)
3.16及以上版本原生支持UDT属性的直接访问,生成的代码会自动带出复合列的子字段访问方法,无需手动拼接SQL片段,写法如下:
import static 你的生成代码包名.tables.Mytab.MYTAB; // ctx为你初始化的DSLContext实例 ctx.update(MYTAB) // 直接通过生成的子字段访问方法获取r字段,设置新值为原值+1 .set(MYTAB.COMPLEX_COL.r(), MYTAB.COMPLEX_COL.r().add(1)) .where(/* 此处填写你的过滤条件 */) .execute();
该写法jOOQ会自动生成和官方示例完全一致的SQL语句。
低于3.16版本的兼容写法
如果使用的jOOQ版本较低,没有自动生成子字段访问方法,可以通过DSL.field()方法手动构造字段表达式实现:
import static org.jooq.impl.DSL.field; import static 你的生成代码包名.tables.Mytab.MYTAB; // 构造(complex_col).r的字段表达式,泛型和r字段的实际类型保持一致即可 Field<Integer> rField = field("({0}).r", Integer.class, MYTAB.COMPLEX_COL); ctx.update(MYTAB) .set(field("complex_col.r", Integer.class), rField.add(1)) .where(/* 此处填写你的过滤条件 */) .execute();
注意事项
- 要使用第一种无硬编码的写法,需要确保你的jOOQ代码生成配置已经开启了UDT(复合类型)的生成开关,生成对应复合类型的Java类后才能使用自动生成的子字段访问方法。
- 两种写法最终生成的执行SQL和PostgreSQL官方示例逻辑完全一致,性能没有差异。
内容的提问来源于stack exchange,提问作者sargue
相关产品推荐
相关产品推荐

