给定一个包含枚举列的表,如下所示:
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将枚举列插入到“未知”(未生成)表中?
根本没有打字
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,或者很可能是我这边缺少了一些配置