当前位置: 首页 > 知识库问答 >
问题:

使用jOOQ将枚举值插入未知表

汝楷
2023-03-14

给定一个包含枚举列的表,如下所示:

CREATE TYPE DIRECTION AS ENUM ('NORTH', 'EAST', 'SOUTH', 'WEST');

CREATE TABLE enum_table (
    direction DIRECTION NOT NULL
);

如何使用jOOQ插入到上述表中,而不为整个表生成Java代码?对于这个特定的实例,由于其他技术限制,我无法(目前)简单地生成代码。如果有帮助的话,我可以复制粘贴一段生成的代码(例如类型定义),但整个表太多了。

我尝试的是:

>

  • 根本不打字:

    context.insertInto(table("enum_table"))
        .columns(field("direction"))
        .values("west")
        .execute();
    

    正如所料,这会引发不兼容的类型:

    org。约克。例外DataAccessException:SQL[插入枚举表(方向)值(?) ];错误:“方向”列的类型为方向,但表达式的类型为字符变化

    列类型为Enum.class强制或铸造到Enum.class

    context.insertInto(table("enum_table"))
        .columns(field("direction", Enum.class))
        .values(DSL.coerce("west", Enum.class))  // or DSL.cast(), same result
        .execute();
    

    它抛出了这个:

    org。约克。例外SQLDiallentNotSupportedException:键入classjava。lang.Enum在方言中不受支持默认值

    (Wut?我绝对已经将我的方言设置为sqldialogue.POSTGRES_9_5

    在Java中创建临时枚举:

    private enum Direction implements EnumType {
        NORTH, EAST, SOUTH, WEST;
    
        @Override
        public String getLiteral() {
            return this.name();
        }
    
        @Override
        public String getName() {
            return "direction";
        }
    }
    
    // and then
    context.insertInto(table("enum_table"))
        .columns(field("direction", Direction.class))
        .values(Direction.WEST)
        .execute();
    

    也尝试了另一种选择——同样的结果:

    .columns(field("direction", SQLDataType.VARCHAR.nullable(false).asEnumDataType(Direction.class)))
    

    再次引发不兼容类型异常:

    org。约克。例外DataAccessException:SQL[插入枚举表(方向)值(?) ];错误:“方向”列的类型为方向,但表达式的类型为字符变化

    是否有任何方法可以使用jOOQ将枚举列插入到“未知”(未生成)表中?


  • 共有1个答案

    聂建茗
    2023-03-14

    根本没有打字

    jOOQ(或者更确切地说是PostgreSQL)需要类型信息来绑定枚举变量。当然,这是一个耻辱,因为从字符串到枚举的转换可以被视为直接的,所以可以隐式地完成。但是PostgreSQL目前不这样工作。

    列类型为枚举。类强制或强制转换为枚举。班

    出于同样的原因,这仍然不起作用。现在,jOOQ知道我们正在处理一个枚举(它以前知道,如果值是非null的),但我们不知道PostgreSQL枚举类型,我们需要将绑定变量强制转换到该类型。

    关于“(Wut?我绝对已经将我的方言设置为SqlDialogue.POSTGRES_9_5.)”:

    如果您查看堆栈跟踪的起始位置,则是在传递Enum时。类DSL。field()。在这个静态方法中,上下文中没有方言,因此出现了这个错误消息

    你很接近:

    在Java中创建临时枚举

    在PostgreSQL中使用EnumType时,还需要返回Schema引用。这是为了区分使用PostgreSQL或MariaDB/MySQL生成的EnumType实例。这可能不是绝对必要的。我会查清楚的https://github.com/jOOQ/jOOQ/issues/7941

    现在,试试这个:

    private enum Direction implements EnumType {
        NORTH, EAST, SOUTH, WEST;
    
        @Override
        public String getLiteral() {
            return this.name();
        }
    
        @Override
        public Schema getSchema() {
            return MY_SCHEMA;
        }
    
        @Override
        public String getName() {
            return "direction";
        }
    }
    
     类似资料:
    • 问题内容: 尝试从数据库检索记录时,我得到了枚举类的“未知名称”值。使用JSF 2.0,JPA。 我的数据库中可能的值为“ F”或“ J” 枚举: 实体: 当我尝试从数据库读取记录时出现错误 您能帮我解决这个问题吗?谢谢 堆栈跟踪: javax.servlet.ServletException:枚举类br.com.aaa.xxx.entidade.TipoPessoa的未知名称值:F javax.

    • 枚举具有名为'hash value'的属性,该属性是枚举内的索引。

    • 我在Java有以下问题。 我有一个eunm,它包含两个值,代表两个字符串值“协调”和“PISC”: 因此,我创建了这个getEnums()方法,它返回一个哈希集,其中包含作为字符串的枚举值: 问题是,当这个方法被称为返回值对象包含2字符串,我认为,但使用deubugget的值放入这个HashSet不是协调和PISC,而是这样的东西: 我认为问题与如何将值插入值哈希集中有关 然后,在代码的其他地方,

    • 问题内容: 我想知道在Java中是否可以嵌套枚举。 在这里,我想做的是: 拥有一个由CAT和DOG组成的物种,将允许我访问可用CAT和DOG品种的子枚举。例如,我希望能够测试是否装有CAT或DOG,以及动物是否是PERSAN CAT或PITBULL狗。CAT和DOG品种必须是不同的枚举,即CatBreeds枚举和DogBreeds枚举。 这是我要使用的访问模式的示例: 种类: 物种 种狗 品种:

    • JEP 361引入了Switch表达式,减少了Switch常见用法的冗长性。 作为此功能的一个特定细节,无需为枚举上的开关表达式编写默认类。编译以下代码: switch表达式目前是详尽的,但如果单独重新编译枚举,则新版本的枚举可能包含switch语句未预料到的另一个条目(例如,三个条目)。 JEP和这篇文章都提到编译器插入了一个default子句,该子句抛出一个异常来指示这种不协调。 我找不到任何

    • 我正在将jooq从3.4.1版本更新到3.9.3版本,并注意到MySQL 5.6数据库中具有枚举字段的表的模型是用字符串类型生成的。 对应于字段的枚举是正确生成的,只是没有链接到对应于表的pojo。 这是为表Foo生成的Pojo示例: 和未链接到表pojo的枚举,尽管其名称中包含表的Foo前缀: 我没有更改任何配置,只更改了jooq版本。我想知道这是否是一个bug,或者很可能是我这边缺少了一些配置