我正在try 使用块语句中的jOOQ更新一个列.我的Kotlin代码如下所示(newNameid是Kotlin变量):

dslContext.begin(
    ...,
    dslContext.update(MYTABLE).set(MYTABLE.NAME, newName).where(MYTABLE.ID.eq(id))
    ...,
).execute()

JOOQ为PostgreSQL(使用jOOQ版本3.18.0)生成如下SQL:

do
$$
begin
    ...;
    update "public"."mytable" set "public"."mytable"."name" = '...';
    ...;
end;
$$;

这完全没问题,除非新名称包含‘$$’.如果我try 将名称设置为类似于foo$$bar的值,则会收到‘UnTerminated字符串文字’错误.

我能够解决这个问题,方法是将新名称除以$$,然后使用DSL.concat(...)重新创建原始字符串.如果jOOQ创建一个带有标记的美元引用的字符串,将会更容易,例如生成如下所示的内容

do
$FOO$
begin
    ...;
    update "public"."mytable" set "public"."mytable"."name" = '...';
    ...;
end;
$FOO$;

这在某种程度上可能吗?

推荐答案

事实上,jOOQ应该更好地处理这一问题.我已经为jOOQ 3.19:https://github.com/jOOQ/jOOQ/issues/14800创建了一个功能请求

这目前是不可配置的,但您可以用ExecuteListener来修补生成的SQL,例如

class PostgresDoPatchListener implements ExecuteListener {
    @Override
    public void renderEnd(ExecuteContext ctx) {
        ctx.sql(ctx.sql().replaceAll(
            "do\\s+\\$\\$(.*)\\$\\$", 
            "do \\$FOO\\$$1\\$FOO\\$"
        ));
    }
}

Postgresql相关问答推荐

Select 所有数组类型和维度

Jsonb[]字段中的PostgreSQL否定&q;-0.0

使用jOOQ在postgres上取消嵌套enum_range

在rust中,有什么方法可以从sqlx::query_with中返回rows_infected以及行本身?

IF 块中的 CREATE FUNCTION 语句抛出错误,同时运行它自己的作品

如何在 postgres 中查询键设置为空值的 jsonb 字段

PL/pgSQL 中 PL/SQL %ISOPEN 的类似功能是什么?

如何为基于复合类型的 Postgres DOMAIN 定义 CHECK 约束

Postgresql:创建默认表空间的视图和使用?

PostgreSQL - 改变数字的精度?

在 PostgreSQL 中返回插入的行

PostgreSQL 查询到 Excel 表

使用 ON CONFLICT 从 INSERT 返回行,无需更新

postgreSQL 将列数据类型更改为没有时区的时间戳

sql语句错误:column .. does not exist

如何使用 node-postgres 将多行正确插入 PG?

将数据从 MS SQL 迁移到 PostgreSQL?

如何为 postgres 编写 DELETE CASCADE?

在子类的 Hibernate 中 for each 表指定不同的序列

Heroku 上的 Postgres 并将单个表转储到转储文件