带有普通 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>)");
我正在构建 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>)");