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

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

acttypeはenumcsなので、enumcsにキャストせずに通常の文字列として挿入することはできません。INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?,?::enumcs,?)

一方、更新に関しては、次のように同じ型キャストを試みましたが、機能しませんでした。

update dir_act set actname=?,acttype=?::enumcs,national_code=? where actcode=?

ベストアンサー1

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

ブログを引用Java 列挙型と PostgreSQL 列挙型間の変換:

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

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

これで、テーブル内のデータ型として「animal」を使用できるようになりました。次に例を示します。

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 であるため、移植できないことにも注意してください。

おすすめ記事