我想从original_content中提取所有行,其中idpipeline_status.oc_version列中,其中pipeline_status.uuid = 4f3164b9-6fde-45d6-bd58-86308473b0dc—我有2个PostgreSQL查询,给了我预期的结果,我想将它们中的任何一个转换为jOOQ:

SELECT oc.* FROM original_content oc
WHERE oc.id = ANY(SELECT unnest(pipeline_status.oc_version) FROM pipeline_status WHERE pipeline_status.uuid='4f3164b9-6fde-45d6-bd58-86308473b0dc' AND pipeline_status.oc_version IS NOT NULL)
-- or 
SELECT oc.* FROM  original_content oc
WHERE oc.id = ANY(array(SELECT ps.oc_version FROM pipeline_status ps WHERE ps.uuid='4f3164b9-6fde-45d6-bd58-86308473b0dc' AND pipeline_status.oc_version IS NOT NULL))

我生成了DSL,我做了一些事情,比如

dslContext.select(
            ORIGINAL_CONTENT.asterisk()
        )
        .from(ORIGINAL_CONTENT)
        .where(ORIGINAL_CONTENT.ID.eq(
                DSL.any(DSL.select(PIPELINE_STATUS.OC_VERSION).from(PIPELINE_STATUS).where(PIPELINE_STATUS.UUID.eq(pipelineUuid)))
            )
        )

但是,我得到了一个错误:

无法解析方法'eq(QuantifiedSelect Record1 T)'<<>>

我该怎么弥补?

我的SQL:

create table public.pipeline_status
(
    uuid                     varchar(50) not null primary key,
    oc_version bigint[]
);


create table original_content
(
    id            bigserial primary key,
    name          varchar(50)                                        not null,
    created_at    timestamp default (now() AT TIME ZONE 'UTC'::text) not null
);

insert into pipeline_status (uuid, oc_version)
values  ('4f3164b9-6fde-45d6-bd58-86308473b0dc', '{1020,1021}');

insert into original_content (id, name,  created_at)
OVERRIDING SYSTEM VALUE
values (1001, 'Name2', '2024-03-22 06:33:12.574244'),
       (1021, 'Name2', '2024-03-22 07:33:32.574244'),
       (1020, 'Name1',  '2024-03-22 09:33:31.574244'),
       (1040, 'Name1',  '2024-03-22 07:33:51.574244'),
       (1002, 'Name3',  '2024-03-22 07:33:13.574244');

SELECT oc.* FROM original_content oc
WHERE oc.id = ANY(SELECT unnest(pipeline_status.oc_version) FROM pipeline_status WHERE pipeline_status.uuid='4f3164b9-6fde-45d6-bd58-86308473b0dc' AND pipeline_status.oc_version IS NOT NULL)

推荐答案

现有try

SELECT子句中使用UNNEST()是一个非常奇怪的、历史悠久的特定于PostgreSQL的特性,jOOQ不支持它的开箱即用功能,尽管您显然可以使用plain SQL templating来使其工作,例如

DSL.field("unnest({0})", 
  ORIGINAL_CONTENT.ID.getDataType(), 
  PIPELINE_STATUS.OC_VERSION
); 

oc.id = ANY(array(SELECT ps.oc_version ..))的方法对我来说似乎是错误的,但我认为它是有效的,因为PostgreSQL不正确地支持多维array.ARRAY(SELECT array_column)表达式应该产生一个BIGINT[][]类型,但PostgreSQL中不存在这种类型,后者只是把它删除了.jOOQ中不支持这一点,因为jOOQ假设正确支持多维数组,所以当你想要Field<Long[]>类型时,你会得到错误的Field<Long[][]>类型.

换句话说,jOOQ并不支持这两个PostgreSQL特有的怪癖.

另一种方法

但是我会重写你的SQL版本的查询:

SELECT * 
FROM original_content oc
EXISTS (
  SELECT 1
  FROM pipeline_status pc
  WHERE pc.uuid = '4f3164b9-6fde-45d6-bd58-86308473b0dc'
  AND pc.oc_version IS NOT NULL
  AND oc.id = ANY(pc.oc_version)
)

使用jOOQ:

ctx.selectFrom(ORIGINAL_CONTENT)
   .where(exists(
        selectOne()
        .from(PIPELINE_STATUS)
        .where(PIPELINE_STATUS.UUID.eq("4f3164b9-6fde-45d6-bd58-86308473b0dc"))
        .and(PIPELINE_STATUS.OC_VERSION.isNotNull())
        .and(ORIGINAL_CONTENT.ID.eq(any(PIPELINE_STATUS.OC_VERSION)))
   ))
   .fetch();

Java相关问答推荐

那么比较似乎不是词典学的,尽管doctor 这么说

为什么我的画布没有显示在PFA应用程序中?

Select 按位运算序列

为什么一个java函数会返回一个作为参数传递给它的对象?

如何在访问完所有文件后加入所有线程?

在for—each循环中的AnimationTimer中的if语句'

内存中的H2修剪尾随空格

使用REST客户端和对象映射器从字符串反序列化Json

使用用户引入的参数生成人员数组

WebSockets和Spring Boot安全性出现错误401

使用Class.this.field=Value初始化构造函数中的最后一个字段会产生错误,而使用this.field=Value则不会

允许同时执行两个方法,但不能同时执行这两个方法

如何以编程方式保存workBench.xmi?

插入中的JOOQ序列,设置为VS值

如何在Java中使用正则表达式拆分字符串

ControlsFX RangeSlider在方向垂直时滞后

Cucumber中第二个网页的类对象未初始化

如何调查进程列表中不可见的活跃 MySQL 事务?

Java-Apache BufferedHttpEntity 在发送请求时加载整个文件

在对象列表上调用提取后,如何判断没有值为空?