web-dev-qa-db-ja.com

Java&Postgres enums-それらをアップデートのために連携させるにはどうすればよいですか?

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=?
16
Ajay Takur

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であることに注意してください。したがって、ポータブルではありません。

17
Andreas

これを行うことで、列挙型のtoString()を回避できます

    stmt.setObject(2,AnimalType.DOG,Java.sql.Types.OTHER)

JDBCドライバーpostgresql 42.2.5で動作します

4

以下のように、型定義とともにPostgresで暗黙の変換を定義する必要があります。

CREATE CAST (varchar AS animal_type) WITH INOUT AS IMPLICIT;

挿入で明示的な変換をスキップできるよりも、そのため、Spring Data JDBCや挿入クエリを生成する他のライブラリとも連携します。

1
Marcin Sarniak