acttype 是一个枚举,因此您不能将其作为普通字符串插入 无需将其转换为枚举
INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?,?::enumcs,?)
至于更新,我尝试了如下相同的类型转换,但它不起作用。
update dir_act set actname=?,acttype=?::enumcs,national_code=? where actcode=?
从 JDBC 的角度来看,只需将 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 枚举之间的转换非常简单。例如,要插入或更新枚举字段,您可以在 SQLPreparedStatement 中使用 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,因此不可移植。
您可以通过这样做来避免枚举上的
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;
您可以跳过插入中的显式转换;因此它也适用于 Spring Data JDBC 和其他为您生成插入查询的库。
如果您使用 SpringJDBC,只需使用 JdbcTemplate 提供
Types.OTHER
作为显式类型,例如:
String sql = "INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?,?,?)";
Object[] arguments = new Object[]{"code", "name", Enum.Type, "nat_code"};
int[] argumentTypes = new int[]{Types.VARCHAR, Types.VARCHAR, Types.OTHER, Types.VARCHAR};
jdbcTemplate.update(sql, arguments, argumentTypes);
@Enumerated(EnumType.STRING)
@Column(name = "type", nullable = false)
private TypeEnum type;
public enum JobTypeEnum {
A,
B
}
create table public.my_table (
id varchar(255) not null,
"type" varchar(10) not null,
constraint my_table primary key (id)
);