Использование двух полей с оператором "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);
Любая помощь будет признательна
Заранее большое спасибо
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