Java& Postgres枚举 - 如何让它们一起工作以进行更新?

时间:2016-11-01 08:53:39

标签: 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=?

4 个答案:

答案 0 :(得分:14)

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

引用博客Convert between Java enums and PostgreSQL enums

  

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

     
CREATE TYPE animal_type AS ENUM('DOG', 'CAT', 'SQUIRREL');
     

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

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

答案 1 :(得分:3)

您必须在Postgres中定义隐式转换以及类型定义,如下所示:

CREATE CAST (varchar AS animal_type) WITH INOUT AS IMPLICIT;

比您可以跳过插入中的显式转换;因此它也可以与Spring Data JDBC和其他确实为您生成插入查询的库一起使用。

答案 2 :(得分:0)

您可以这样做避免在Enum上使用toString()

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

适用于JDBC驱动程序的PostgreSQL 42.2.5版

答案 3 :(得分:0)

如果您使用的是 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);