Java 爪哇及;Postgres枚举-如何使它们一起工作以进行更新?

Java 爪哇及;Postgres枚举-如何使它们一起工作以进行更新?,java,sql,postgresql,jdbc,Java,Sql,Postgresql,Jdbc,acttype是enumcs,因此不能将其作为普通字符串插入 不将其强制转换为enumcs插入目录act(actcode、actname、acttype、national_code)值(?,?::enumcs,?) 至于更新,我尝试了如下相同的类型转换,但不起作用 update dir_act set actname=?,acttype=?::enumcs,national_code=? where actcode=? 从JDBC的角度来看,只需将PostgreSQL枚举视为字符串 引用博客:

acttype是enumcs,因此不能将其作为普通字符串插入 不将其强制转换为enumcs
插入目录act(actcode、actname、acttype、national_code)值(?,?::enumcs,?)

至于更新,我尝试了如下相同的类型转换,但不起作用

update dir_act set actname=?,acttype=?::enumcs,national_code=? where actcode=?

从JDBC的角度来看,只需将PostgreSQL枚举视为字符串

引用博客:

PostgreSQL允许您使用以下语法创建枚举类型:

创建动物类型作为枚举(“狗”、“猫”、“松鼠”);
您现在可以在表中使用“animal”作为数据类型,例如:

创建表格宠物(
pet_id整数不为空,
宠物类型动物类型不为空,
名称varchar(20)不为空
);
在Java中,您将拥有相应的枚举类型:

公共枚举动物类型{
狗,
猫,
松鼠;
}
Java和PostgreSQL枚举之间的转换非常简单。例如,要插入或更新枚举字段,可以在SQL PreparedStatement中使用强制转换语法:

插入宠物(宠物id,宠物类型,名称)值(?,铸造(?动物类型),?);
--或
插入宠物(宠物id、宠物类型、名称)值(?,::动物类型,?);
Postgres还允许您通过将枚举值作为字符串传递来插入/更新枚举。

无论是否强制转换,Java方面都是一样的。您可以如下设置字段:

stmt.setInt(1,1);
stmt.setString(2,AnimalType.DOG.toString());
stmt.setString(3,'Rex');
从SELECT语句检索枚举如下所示:

AnimalType.valueOf(stmt.getString(“pet_类型”);
考虑到枚举是区分大小写的,所以必须考虑Postgres枚举和Java枚举之间的任何大小写不匹配。还要注意,PostgreSQL枚举类型是非标准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;

然后可以跳过insert中的显式转换;因此,它也适用于Spring数据JDBC和其他为您生成插入查询的lib。

它必须是
acttype=?
并且在
prepared语句中
将它转换为
enum
@Ashish我确实尝试过您的解决方案,但我得到了org.postgresql.util.PSQLException:ERROR:type“enum”不存在谢谢你的精彩解释。然而,我认为这是Postgres JDBC驱动程序中的一个缺陷: