sql >> データベース >  >> RDS >> PostgreSQL

JavaとPostgresの列挙型を連携させて更新するにはどうすればよいですか?

    JDBCの観点からは、PostgreSQL列挙型を文字列のように扱うだけです。

    ブログの引用JavaenumとPostgreSQLenumの間の変換:

    PostgreSQLでは、次の構文を使用して列挙型を作成できます。

    CREATE TYPE animal_type AS ENUM('DOG', 'CAT', 'SQUIRREL');
    

    これで、テーブルのデータ型として「動物」を使用できます。例:

    create table pet (                         
        pet_id        integer         not null,
        pet_type      animal_type     not null,
        name          varchar(20)     not null
    );
    

    Javaでは、対応する列挙型があります:

    public enum AnimalType {
        DOG,
        CAT,
        SQUIRREL;
    }
    

    JavaとPostgreSQLの列挙型の間の変換は簡単です。たとえば、列挙型フィールドを挿入または更新するには、SQLのPreparedStatementでCAST構文を使用できます。

    INSERT INTO pet (pet_id, pet_type, name) VALUES (?, CAST(? AS animal_type), ?);
    
    --or
    
    INSERT INTO pet (pet_id, pet_type, name) VALUES (?, ?::animal_type, ?);
    

    Postgresでは、値を文字列として渡すだけで列挙型を挿入/更新することもできます。

    キャストするかどうかにかかわらず、Java側は同じです。次のようにフィールドを設定します:

    stmt.setInt(1, 1);
    stmt.setString(2, AnimalType.DOG.toString());
    stmt.setString(3, 'Rex');
    

    SELECTステートメントから列挙型を取得する方法は次のようになります。

    AnimalType.valueOf(stmt.getString("pet_type"));
    

    列挙型では大文字と小文字が区別されるため、Postgres列挙型とJava列挙型の間の大文字と小文字の不一致を考慮する必要があります。また、PostgreSQL列挙型は非標準SQLであるため、移植性がないことにも注意してください。



    1. SQLiteAssetHelperクラスを使用してデータベースをコピーできません

    2. WithoutRowIDで主キーを使用する

    3. django.db.utils.ProgrammingError:manage.pyテスト中にリレーションapp_userが存在しません

    4. キーワード'with'の近くの構文が正しくありません...前のステートメントはセミコロンで終了する必要があります