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