Примечание:
У меня был открытый вопрос, как сгенерировать следующее SQL
в
JOOQ
но за последние два дня я отработал 99% и это
привел меня к другой проблеме - которая описана здесь - как мой
текущее решение не ответило на мой первоначальный вопрос, я удалил
другой вопрос и создал этот новый - вместо того, чтобы заменить
Оригинальный вопрос.
UPDATE:
Изменив этот вопрос на решение, как указал Лукас Эдер, полученный SQL-код допустим. Спасибо.
У меня есть следующий запрос SQL
- в качестве примера, который преобразован в JOOQ
API
для генерации SQL
для разных таблиц:
SELECT c.*
FROM contacts c
JOIN (
VALUES
(0, 13259),
(1, 12472),
(2, 12422)
) AS il(listindex, id) ON c.id = il.id
ORDER BY il.listindex;
Я создал следующий код на основе JOOQ
руководства VALUES()
и JOIN
Примечание:
это автономный пример, который создает таблицы, поля и имена из строк.
ни один из этого кода на самом деле не выполняется в базе данных, он просто генерирует SQL
import static org.jooq.impl.DSL.row;
import static org.jooq.impl.DSL.values;
import static org.jooq.impl.DSL.table;
import static org.jooq.impl.DSL.field;
import static org.jooq.impl.DSL.name;
import org.jooq.DSLContext;
import org.jooq.Field;
import org.jooq.Name;
import org.jooq.Record;
import org.jooq.Row2;
import org.jooq.SQLDialect;
import org.jooq.SelectJoinStep;
import org.jooq.Table;
import org.jooq.impl.DSL;
public class StackoverflowJOOQQuestion {
public static void main(String[] args) {
DSLContext ctx = DSL.using(SQLDialect.H2);
// create test data (as in the sql statement on top)
Long[] lon = new Long[] { 13259l, 12472l, 12422l };
Row2<Integer, Long>[] rows = new Row2[lon.length];
for (int i = 0; i < rows.length; i++) {
rows[i] = row(i, lon[i]);
}
// create Names, Fields and Tables
// contacts table
Name contactIdName = name("tContacts", "conIdContact");
Field contactIdField = field(contactIdName, Long.class);
Name contactNameName = name("tContacts", "conContactName");
Field contactNameField = DSL.field(contactNameName, String.class);
// values table
Name nameTableValues = name("il");
Table valuesTable = table(nameTableValues);
Name nameTableValuesIndex = name("il", "listindex");
Field valuesIndexField = field(nameTableValuesIndex, Integer.class);
Name nameTableValuesId = name("il", "id");
Field valuesIdField = field(nameTableValuesId, Long.class);
// build the SQL query
SelectJoinStep<Record> step = ctx.select(contactNameField).from("tContacts")
.join(//
values(rows)//
// NOTE: also works with Strings, Names or Table and
// Fields as shown here
// .as("il", "listindex", "id")//
// .as(nameTableValues, nameTableValuesIndex, nameTableValuesId)//
.as(valuesTable, valuesIndexField, valuesIdField)//
).on(contactIdField.eq(valuesIdField));
// print the query
System.out.println(step.getSQL());
}
}
но это дает следующий вывод:
select "tContacts"."conContactName" from tContacts join (
(select null "listindex", null "id" where 1 = 0) union all
(select * from (
values (cast(? as int), cast(? as bigint))
, (cast(? as int), cast(? as bigint))
, (cast(? as int), cast(? as bigint))
) "il")
) "il" on "tContacts"."conIdContact" = "il"."id"