Присоединение таблицы к VALUES () с использованием JOOQ DSL API - PullRequest
0 голосов
/ 07 мая 2018

Примечание:

У меня был открытый вопрос, как сгенерировать следующее 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"

1 Ответ

0 голосов
/ 07 мая 2018

Это не ошибка, и нет проблем с вашим сгенерированным SQL. Производная таблица, к которой вы присоединяетесь, имеет необходимые имена столбцов. Обратите внимание:

(select null "listindex", null "id" where 1 = 0) union all ...

Эмуляция применяется при использовании функции производных списков столбцов для некоторых баз данных. См:

Лишь недавно база данных H2 добавила поддержку функции списка производных столбцов, поэтому сгенерированный jOOQ SQL может быть устаревшим:

Но по причинам обратной совместимости было бы неразумно переходить на более новый синтаксис.

Учитывая, что H2 не имеет четко определенной схемы управления версиями основного выпуска, jOOQ также не различает диалекты H2.

...