В 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?




Хотя эти два типа идентичны структурно, они не совпадают номинально. 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
Спасибо за быстрый ответ!