Вставить ... выбрать с помощью перечислений в jOOQ

В MariaDB (MySQL) я могу делать следующее:

create table T1 (
    t1_field enum('yes', 'no', 'meh')
);

create table T2 (
    t2_field enum('yes', 'no', 'meh')
);

insert into T1 (t1_field) 
values ('yes'), ('meh');

insert into T2 (t2_field)
select t1_field
from T1;

Поскольку оба перечисления одинаковы. Если я попытаюсь выполнить последний запрос в jOOQ, он не сработает из-за несовместимых типов:

using(t)
    .insertInto(T2, T2.T2_FIELD)
    .select(
        select(
            T1.T1_FIELD
        )
        .from(T1)
    )
    .execute();

=> Метод select (Select>) в типе InsertValuesStep1 не применим для аргументов (SelectJoinStep>)

Как мне с этим справиться? Как мне получить соответствие типов перечислений в jOOQ?

Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
0
439
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Хотя эти два типа идентичны структурно, они не совпадают номинально. jOOQ не обрабатывает типы перечислений MySQL / MariaDB одинаково, если они имеют одно и то же определение. Каждый тип перечисления уникален.

Одноразовое решение для этого конкретного запроса

Однако вы можете обойти эту проблему, переведя один тип в другой с помощью Field.coerce(Field):

using(t)
    .insertInto(T2, T2.T2_FIELD)
    .select(
        select(
            T1.T1_FIELD.coerce(T2.T2_FIELD)
        )
        .from(T1)
    )
    .execute();

Приведение типов работает аналогично приведению типов, за исключением того, что оно не влияет на фактический создаваемый SQL-запрос. В каком-то смысле это работает как небезопасное приведение типов в Java.

Долгосрочное решение с использованием генерации кода

Если вы хотите, чтобы два типа были одинаковыми, вам нужно будет использовать Converter для преобразования всех соответствующих столбцов в один и тот же тип перечисления. Видеть: https://www.jooq.org/doc/latest/manual/code-generation/custom-data-types

Спасибо за быстрый ответ!

Friso 24.04.2018 11:02

Другие вопросы по теме