jOOQと未知の表に列挙値を挿入

ペトルJanecek:

このように、列挙型の列を持つテーブルがあるとします。

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.classDSL.field()その静的メソッドでは、何の方言は、このエラーメッセージが表示されたのだから、なぜ、コンテキストにありません。

解決

あなたは近くにありました。

アドホック列挙Javaで作成

使用する場合はEnumTypePostgreSQLでは、あなたも返す必要がSchema参照を。これは、区別することであるEnumTypePostgreSQLや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";
    }
}

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=218004&siteId=1