带有普通 SQL 的 JOOQ EXISTS 子句

JOOQ EXISTS clause with plain SQL

我正在构建 JOOQ 查询的 WHERE 子句。有些条件使用 EXISTS,我想将子查询提供为普通的 SQL,因为它们用 JOOQ 表达很冗长。例如

select 1 from jsonb_array_elements(resource->'name') as t1,
  jsonb_array_elements_text(t1.value->'given') as t2
where t2.value like ?

然而 DSL.exists() 只接受 Select 类型作为参数,无论我使用哪种 DSL.select...() 方法,它都会包装我的 SQL 片段与另一个 select.

DSL.exists(DSL.selectFrom(DSL.sql(...)))

查询如下:

... where exists (select * from (select 1 from ...

有没有办法避免不需要的包装器select?

为什么把 SQL 放在 DSL.sql 中?

您可以将 SQL 字符串直接传递给 selectFrom:

DSL.exists(DSL.selectFrom(...))

那么你没有得到这个包装器select。

现在我所能做的就是将 SQL 砍掉。我仍然对不同的解决方案感兴趣。

return DSL.exists(DSL.selectOne().from(
    "jsonb_array_elements(resource->'name') as t1," +
    " jsonb_array_elements_text(t1.value->'given') as t2"
).where(
    "t2.value like ?", pattern)
);

您可以使用像这样的普通 SQL 条件:

Condition condition = DSL.condition("exists (<your select here>)");