Использование двух полей с оператором "in" в QueryDSL



Я должен написать этот запрос с помощью QueryDSL:



select *
from table
where(field1, field2) in (
select inner_field_1, inner_field2
from ...
);


Однако я не знаю, как использовать два поля (field1 и field2) с оператором" in " в QueryDSL. Я искал его в документации, но я не видел ни одного примера двух полей.



Вот что у меня есть до сих пор:



Expression<?>[] projection = {
table.field1,
table.field2
};

SQLSubQuery outterQuery= new SQLSubQuery()
.from(table)
.where([some expression].in(inneryQuery.list(projection))) // ???
.groupBy(contentcache1.programId, contentcache1.id);


Любая помощь будет признательна



Заранее большое спасибо

665   3  

3 ответов:

Вы можете переписать исходный запрос следующим образом:

select *
from table, (select distinct inner_field_1, inner_field2 from ...) subquery
where field1 = subquery.field1 and field2 = subquery.field2

Тогда вам не нужно использовать оператор IN.

Вы можете выразить это через

SQLSubQuery outerQuery = new SQLSubQuery()
    .from(table)
    .where(Expressions.list(column1, column2, ...).in(inneryQuery.list(projection))) 
    .groupBy(contentcache1.programId, contentcache1.id);

Вы можете вручную преобразовать свой предикат row-value-expression IN в эквивалентный предикат EXISTS, который, вероятно, должен работать с QueryDSL. некоторые детали объясняются в этом блоге, который по существу объясняет, как jOOQ автоматически обрабатывает такие преобразования SQL для вас, работая непосредственно на SQL AST, вы бы написали:

DSL.using(configuration)
   .select()
   .from(TABLE)
   .where(row(TABLE.FIELD1, TABLE.FIELD2).in(
       select(INNER_FIELD1, INNER_FIELD_2)
       .from(...)
   ))

Ваш исходный запрос:

select *
from table
where(field1, field2) in (
    select inner_field_1, inner_field_2
    from ...
);

Эквивалентно этому:

select *
from table
where exists (
    select 1
    from ...
    where table.field1 = inner_field_1 and table.field2 = inner_field2
)

... что, я уверен, вы можете сделать. express с QueryDSL (к сожалению, я не знаю API достаточно хорошо, чтобы показать фактический запрос).

Примечание о совместимости

Скорее всего, ваша база данных не поддерживает этот тип предиката выражения значения строки, в случае которого вы находитесь на безопасной стороне с EXISTS. По крайней мере, эти базы данных поддерживают этот предикат:

  • DB2
  • HSQLDB
  • MySQL
  • Оракул
  • Postgres

Comments

    Ничего не найдено.