如何使用jOOQ创建SELECT EXISTS(子查询)?

12

我希望使用jOOQ构建并执行类似于这样的查询。

SELECT EXISTS( subquery )

例如:

SELECT EXISTS(SELECT 1 FROM icona_etiqueta WHERE pvp IS NULL AND unitat_venda = 'GRAMS')

我该怎么做?它能完成吗?


1
用户又会写 SQL,但第三方软件却成了阻碍的情况? - Rick James
1
是的,但比我见过的任何相关软件都要少得多。实际上,在发现这个SO问题之前,我曾经想过自己“哦,看看,我又得谷歌一些关于jOOQ的东西了,已经有一段时间了”,大约花了1.5分钟的时间。 - Gregor Petrin
2个回答

26

找到了。我在寻找一个selectExists方法时被DSL.exists()谓词构造器搞混了。

fetchExists(subquery)更加方便。

我的具体例子可以这样解决:

create.fetchExists(
        create.selectOne()
              .from(ICONA_ETIQUETA)
              .where(ICONA_ETIQUETA.PVP.isNull(),
                     ICONA_ETIQUETA.UNITAT_VENDA.eq('GRAMS'))
    );

直接返回一个布尔值。


11

您自己的解决方案是您想要做的事情最方便的方法。更一般的方法是使用:

create.select(field(exists(...)));

你可以使用DSL.field(Condition)将一个由DSL.exists(Select)创建的Condition嵌套在一个Field中。但是从jOOQ 3.9开始,Field<Boolean>Condition不再是相同类型。这在jOOQ 3.17中已经发生了变化,详情请参见#11969。你现在也可以使用下面的简写形式:

create.select(exists(...));

我正在使用R2dbc,我必须使用它来代替fetchExists - Hantsy
1
@Hantsy:那只是为了方便上面的操作,没有相应的响应式功能。只需要使用我在此答案中描述的内容即可。 - Lukas Eder

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接