Как можно объединить две разные таблицы JooQ с одинаковыми столбцами и типами данных? - PullRequest
0 голосов
/ 29 января 2019

У меня есть две таблицы в моей базе данных, эти таблицы имеют одинаковые точные столбцы и типы данных, но в другом порядке.

В таблице A есть столбцы: A, B, C, D.

В таблице B есть столбцы: A, C, D, B.

У меня есть приложение, которое использует JooQ для запросов к базе данных и использует Codegen для создания таблиц и записей.Однако, это не позволит мне объединить два оператора select из-за ошибки компиляции.Что я могу сделать, чтобы объединить две таблицы?

StepWhereSelect<ARecord> query = dsl.selectFrom(A);
StepWhereSelect<BRecord> query2 = dsl.selectFrom(B);
query.union(query2)

В переменной внутри функции объединения он содержит информацию о несоответствии типов из SelectUnionStep, касающегося объединения (ARecord), которое нельзя применить к объединению (BRecord).

Где я могу сделать в JooQ объединение этих двух таблиц?

1 Ответ

0 голосов
/ 30 января 2019

Вам нужна поддержка стандартного синтаксиса SQL jOOQ UNION CORRESPONDING.Синтаксис в настоящее время не реализован ни в одной СУБД, о которой я знаю, но он может быть легко эмулирован jOOQ.При отсутствии поддержки этого синтаксиса вы можете создать правильный порядок столбцов в обоих подзапросах, используя этот код:

var q1 = dsl.select(Stream.of(A.fields()).sorted(Field::getName).collect(toList()))
            .from(A);
var q2 = dsl.select(Stream.of(B.fields()).sorted(Field::getName).collect(toList()))
            .from(A);
q1.union(q2).fetch();

Конечно, в этом больше нет безопасности типов.Если вы все еще хотите получать ARecord типов, вы можете написать

q1.union(q2).fetchInto(A);
...