【问题标题】:Insert ... select with enums in jOOQ插入 ... 在 jOOQ 中使用枚举选择
【发布时间】:2018-10-03 16:32:18
【问题描述】:

在 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();

=> InsertValuesStep1 类型中的方法 select(Select>) 不适用于参数 (SelectJoinStep>)

我该如何处理?如何让枚举类型在 jOOQ 中匹配?

【问题讨论】:

    标签: java sql mariadb jooq


    【解决方案1】:

    虽然这两种类型相同,但在结构上,它们名义上并不相同。如果 MySQL / MariaDB 枚举类型具有完全相同的定义,则 jOOQ 不会将它们视为相同。每个枚举类型都是唯一的。

    此特定查询的一次性解决方案

    但是,您可以通过使用 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

    【讨论】:

    • 感谢您的及时回复!
    猜你喜欢
    • 2016-07-03
    • 2023-04-03
    • 2021-08-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-03-07
    相关资源
    最近更新 更多