このように、列挙型の列を持つテーブルがあるとします。
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 (?)
]; ERROR:コラム「方向」型である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
:Typeクラスはjava.lang.Enum
方言でサポートされていませんDEFAULT
。(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 (?)
]; ERROR:コラム「方向」型であるdirection
が、式は型ですcharacter varying
。
jOOQを使用して列挙型の列と「不明」(生成されていない)テーブルに挿入する方法はありますか?
既存の試みへのコメント:
全くタイピングありません
それは動作しません。jOOQ(またはむしろPostgreSQLは)列挙型変数をバインドする型情報を必要とします。それは暗黙的に行うことができるように、文字列から列挙型への変換は、まっすぐ進むと見ることができるので、これは、当然のことながら、恥です。しかし、PostgreSQLは現在、このように動作しません。
Enum.classが+強要またはEnum.classにキャストとしてカラム型
これはまだ同様の理由により、動作しません。さて、jOOQは(値がnull以外であった場合、それは、前に知っていた)私たちは、列挙型を扱っていることを知っているが、我々は我々がバインド変数をキャストする必要があるPostgreSQLの列挙型を知りません。
「(?。WUT私は絶対SQLDialect.POSTGRES_9_5に自分の方言を設定されています)」:
あなたはどこスタックトレースの発信元を見れば、あなたが通過するとき、それはだEnum.class
しDSL.field()
。その静的メソッドでは、何の方言は、このエラーメッセージが表示されたのだから、なぜ、コンテキストにありません。
解決
あなたは近くにありました。
アドホック列挙Javaで作成
使用する場合はEnumType
PostgreSQLでは、あなたも返す必要がSchema
参照を。これは、区別することであるEnumType
PostgreSQLやMariaDB / MySQLので生成されたインスタンス。これはおそらく、厳密には必要ではありません。それをチェックします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";
}
}