JOOQ EXISTS предложение с простым SQL - PullRequest
1 голос
/ 26 февраля 2020

Я строю предложение WHERE запроса JOOQ. Некоторые условия используют 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 type в качестве параметра, и независимо от того, какой метод DSL.select ... () я использую, он обернет мой фрагмент SQL другим select.

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

И запрос будет выглядеть так:

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

Есть ли способ избежать ненужного выбора оболочки?

Ответы [ 3 ]

1 голос
/ 27 февраля 2020

Пока все, что я мог сделать, это нарезать 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)
);
1 голос
/ 27 февраля 2020

Вы можете использовать простое SQL условие, подобное этому:

Condition condition = DSL.condition("exists (<your select here>)");
1 голос
/ 26 февраля 2020

Почему вы помещаете SQL в DSL. sql?

Вы можете передать строку SQL непосредственно в selectFrom:

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

Тогда вы не получить эту обертку выберите.

...