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=?
JDBCの観点からは、PostgreSQL列挙型を文字列のように扱います。
引用ブログ Java列挙型とPostgreSQL列挙型の間で変換 :
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"));
Enumは大文字と小文字が区別されることを考慮してください。したがって、PostgresのenumとJava enumの間の大文字と小文字の不一致はすべて考慮する必要があります。また、PostgreSQLのenum型は非標準のSQLであることに注意してください。したがって、ポータブルではありません。
これを行うことで、列挙型のtoString()を回避できます
stmt.setObject(2,AnimalType.DOG,Java.sql.Types.OTHER)
JDBCドライバーpostgresql 42.2.5で動作します
以下のように、型定義とともにPostgresで暗黙の変換を定義する必要があります。
CREATE CAST (varchar AS animal_type) WITH INOUT AS IMPLICIT;
挿入で明示的な変換をスキップできるよりも、そのため、Spring Data JDBCや挿入クエリを生成する他のライブラリとも連携します。