Jooq 因部分索引的“冲突...哪里”而失败,但 sql 可以直接工作?

问题描述 投票:0回答:1

使用JOOQ 3.17.4,pgjdbc 42.5.0,postgres 14.3

我在这里知道这个答案:https://stackoverflow.com/a/67292162/924597 - 我尝试过使用非限定字段名称,但没有什么区别。

我正在尝试使用部分索引发出“冲突时..更新...位置”的 SQL,但出现错误:

 ERROR: there is no unique or exclusion constraint matching the ON CONFLICT specification

奇怪的是,Postgres 只在通过 JOOQ 发出 SQL 时才会失败。 如果我从控制台复制 SQL(由 P6Spy 打印)并粘贴到 IntelliJ IDEA 的 SQL 编辑器中 - 完全相同的 SQL 可以正确执行

架构定义:

create table user_authz_request ( id bigint generated always as identity (start with 30000000) primary key not null, status auth_request_status not null, service_point_id bigint not null references service_point, email varchar(256) not null, client_id varchar(256) not null, id_provider id_provider not null, subject varchar(256) not null, responding_user bigint references app_user null, description varchar(1024) not null, date_requested timestamp without time zone default transaction_timestamp(), date_responded timestamp without time zone null ); create unique index user_authz_request_once_active_key on user_authz_request(service_point_id, client_id, subject) where status = 'REQUESTED';
JOOQ代码:

db.insertInto(USER_AUTHZ_REQUEST). set(USER_AUTHZ_REQUEST.SERVICE_POINT_ID, req.getServicePointId()). set(USER_AUTHZ_REQUEST.STATUS, REQUESTED). set(USER_AUTHZ_REQUEST.EMAIL, email). set(USER_AUTHZ_REQUEST.CLIENT_ID, user.getClientId()). set(USER_AUTHZ_REQUEST.ID_PROVIDER, idProvider). set(USER_AUTHZ_REQUEST.SUBJECT, user.getSubject()). set(USER_AUTHZ_REQUEST.DESCRIPTION, req.getComments()). onConflict( USER_AUTHZ_REQUEST.SERVICE_POINT_ID, USER_AUTHZ_REQUEST.CLIENT_ID, USER_AUTHZ_REQUEST.SUBJECT). where(USER_AUTHZ_REQUEST.STATUS.eq(REQUESTED)). doUpdate(). set(USER_AUTHZ_REQUEST.DESCRIPTION, req.getComments()). set(USER_AUTHZ_REQUEST.DATE_REQUESTED, LocalDateTime.now()). execute();
生成的SQL:

insert into api_svc.user_authz_request (service_point_id, status, email, client_id, id_provider, subject, description) values (20000001, cast('REQUESTED' as api_svc.auth_request_status), 'email', 'client id', cast('AAF' as api_svc.id_provider), 'subject', 'first') on conflict (service_point_id, client_id, subject) where status = cast('REQUESTED' as api_svc.auth_request_status) do update set description = 'first', date_requested = cast('2022-09-20T05:35:35.927+0000' as timestamp(6))
上面是在我的服务器中运行时失败的 SQL,但当我通过 IntelliJ 执行它时工作正常。

我做错了什么?

postgresql jooq
1个回答
1
投票
从 jOOQ 3.18 和

#12531 开始,jOOQ 将自动内联该 WHERE

 子句中的所有绑定变量,因为使用绑定值几乎没有意义。这在 jOOQ 的通常行为中是一个很大的例外,因为只有极少数情况下:

    绑定值在语法上是正确的
  • 但同时,完全没用
在大多数其他情况下,绑定值是自动内联的,它们在语法上也不正确,因此自动内联可能不太有争议。

在 3.18 和

#12531 发布之前,您可以简单地手动内联绑定值,而不是:

where(USER_AUTHZ_REQUEST.STATUS.eq(inline(REQUESTED, USER_AUTHZ_REQUEST.STATUS))).
另请参阅:

  • 内联绑定值
  • 自动内联某些列的绑定值
这实际上与您链接的问题相同:

在 jOOQ 中使用部分索引更新插入“冲突时执行更新”,只是一种不同的表现形式

© www.soinside.com 2019 - 2024. All rights reserved.