Aja*_*kur 11 java sql postgresql jdbc
acttype是一个枚举,因此您不能将其作为普通字符串插入而不将其强制转换为枚举 INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?,?::enumcs,?)
对于更新,我尝试使用相同的类型转换如下,但它不起作用.
update dir_act set actname=?,acttype=?::enumcs,national_code=? where actcode=?
Run Code Online (Sandbox Code Playgroud)
And*_*eas 18
从JDBC的角度来看,只需将PostgreSQL枚举视为一个字符串即可.
PostgreSQL允许您使用以下语法创建枚举类型:
Run Code Online (Sandbox Code Playgroud)CREATE TYPE animal_type AS ENUM('DOG', 'CAT', 'SQUIRREL');
您现在可以在表中使用"animal"作为数据类型,例如:
Run Code Online (Sandbox Code Playgroud)create table pet ( pet_id integer not null, pet_type animal_type not null, name varchar(20) not null );
在Java中,您将拥有相应的枚举类型:
Run Code Online (Sandbox Code Playgroud)public enum AnimalType { DOG, CAT, SQUIRREL; }
在Java和PostgreSQL枚举之间进行转换非常简单.例如,要插入或更新枚举字段,可以在SQL PreparedStatement中使用CAST语法:
Run Code Online (Sandbox Code Playgroud)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方面都是一样的.您可以设置如下字段:
Run Code Online (Sandbox Code Playgroud)stmt.setInt(1, 1); stmt.setString(2, AnimalType.DOG.toString()); stmt.setString(3, 'Rex');
从SELECT语句中检索枚举如下所示:
Run Code Online (Sandbox Code Playgroud)AnimalType.valueOf(stmt.getString("pet_type"));
考虑到枚举是区分大小写的,因此必须考虑Postgres枚举和Java枚举之间的任何不匹配情况.另请注意,PostgreSQL枚举类型是非标准SQL,因此不可移植.
小智 10
您必须在 Postgres 中定义隐式转换以及类型定义,如下所示:
CREATE CAST (varchar AS animal_type) WITH INOUT AS IMPLICIT;
Run Code Online (Sandbox Code Playgroud)
您可以跳过插入中的显式转换;因此它也适用于 Spring Data JDBC 和其他为您生成插入查询的库。
您可以这样做避免在Enum上使用toString()
stmt.setObject(2,AnimalType.DOG,java.sql.Types.OTHER)
Run Code Online (Sandbox Code Playgroud)
适用于JDBC驱动程序postgresql 42.2.5