繁体   English   中英

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

[英]Insert an enum value into an unknown table with jOOQ

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

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.jooq.exception.DataAccessException :SQL [ insert into enum_table (direction) values (?) ]; 错误:列“方向”是类型direction但表达式的类型是character varying

  • 列类型为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.jooq.exception.SQLDialectNotSupportedException :方言DEFAULT不支持类型类java.lang.Enum

    (哇?我绝对把我的方言设置为SQLDialect.POSTGRES_9_5 。)

  • 在Java中创建ad-hoc枚举:

     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.jooq.exception.DataAccessException :SQL [ insert into enum_table (direction) values (?) ]; 错误:列“方向”是类型direction但表达式的类型是character varying


有没有办法使用jOOQ插入带有枚举列的“未知”(未生成)表?

对您现有尝试的评论:

根本没有打字

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

列类型为Enum.class +强制转换或转换为Enum.class

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

关于“(但是?我绝对将我的方言设置为SQLDialect.POSTGRES_9_5。)”

如果你看一下堆栈跟踪的起源,那就是当你将Enum.class传递给DSL.field() 在该静态方法中,上下文中没有方言,因此出现此错误消息的原因。

你很亲密:

在Java中创建ad-hoc枚举

在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";
    }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM