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