Java 爪哇及;Postgres枚举-如何使它们一起工作以进行更新?
acttype是enumcs,因此不能将其作为普通字符串插入 不将其强制转换为enumcsJava 爪哇及;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枚举视为字符串 引用博客:
插入目录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驱动程序中的一个缺陷: