【发布时间】:2023-04-03 09:39:01
【问题描述】:
给定一个带有枚举列的表,如下所示:
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。(Wut?我绝对已将我的方言设置为
SQLDialect.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.jooq.exception.DataAccessException: SQL [insert into enum_table (direction) values (?)];错误:“方向”列的类型为direction,但表达式的类型为character varying。
有什么方法可以使用 jOOQ 插入带有枚举列的“未知”(未生成)表?
【问题讨论】:
标签: java postgresql enums jooq