【问题标题】:How do I make Java & Postgres enums work together for update?如何使 Java 和 Postgres 枚举一起工作以进行更新?
【发布时间】:2017-03-14 09:30:33
【问题描述】:

acttype 是一个 enumcs,因此您不能将其作为普通字符串插入 无需将其转换为枚举 INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?,?::enumcs,?)

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

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

【问题讨论】:

  • 它必须是 acttype=? 并在 prepared statement 中将其转换为 enum
  • @Ashish 我确实尝试过你的解决方案,但我得到了 org.postgresql.util.PSQLException: ERROR: type "enum" does not exist

标签: java sql postgresql jdbc


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    您可以通过这样做避免枚举上的toString()

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

    适用于 JDBC 驱动程序 PostgreSQL 42.2.5

    【讨论】:

      【解决方案3】:

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

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

      你可以跳过插入中的显式转换;因此它也适用于 Spring Data JDBC 和其他为您生成插入查询的库。

      【讨论】:

        【解决方案4】:

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

        引用博客Convert between Java enums and PostgreSQL enums

        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 枚举之间的转换非常简单。例如,要插入或更新枚举字段,您可以在 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,因此不可移植。

        【讨论】:

        猜你喜欢
        • 2010-10-25
        • 2019-02-16
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2023-04-04
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多