如何使 Java 和 Postgres 枚举一起工作以进行更新?

2022-09-01 20:21:01

acttype 是一个枚举,因此如果不将其转换为枚举,则无法将其作为普通字符串插入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');

现在,您可以在表中使用“动物”作为数据类型,例如:

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,因此不可移植。


答案 2

您可以通过执行此操作来避免枚举toString()

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

适用于 JDBC 驱动程序 PostgreSQL 42.2.5


推荐