Java & Postgres enums - How do I make them work together for update?

前端 未结 3 487
不思量自难忘°
不思量自难忘° 2020-12-28 16:34

acttype is an enumcs so you can\'t insert it as a normal string without casting it to an enumcs INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?

相关标签:
3条回答
  • 2020-12-28 16:38

    From JDBC's point-of-view, just treat the PostgreSQL enum like a string.

    Quoting blog Convert between Java enums and PostgreSQL enums:

    PostgreSQL allows you to create enum types using the following syntax:

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

    You can now use ‘animal’ as a datatype in your tables, for example:

    create table pet (                         
        pet_id        integer         not null,
        pet_type      animal_type     not null,
        name          varchar(20)     not null
    );
    

    In Java, you’d have a corresponding enum type:

    public enum AnimalType {
        DOG,
        CAT,
        SQUIRREL;
    }
    

    Converting between Java and PostgreSQL enums is straightforward. For example, to insert or update an enum field you could use the CAST syntax in your SQL PreparedStatement:

    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 will also let you insert/update an enum just by passing its value as a string.

    Whether casting or not, the Java side is the same. You would set the fields like this:

    stmt.setInt(1, 1);
    stmt.setString(2, AnimalType.DOG.toString());
    stmt.setString(3, 'Rex');
    

    Retrieving the enum from a SELECT statement looks like this:

    AnimalType.valueOf(stmt.getString("pet_type"));
    

    Take into consideration that enums are case-sensitive, so any case mismatches between your Postgres enums and Java enums will have to be accounted for. Also note that the PostgreSQL enum type is non-standard SQL, and thus not portable.

    0 讨论(0)
  • 2020-12-28 16:47

    You have to define implicit conversion in Postgres along with your type definition, like below:

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

    Than you can skip the explicit conversion in insert; so it works also with Spring Data JDBC and other libs that do generate insert query for you.

    0 讨论(0)
  • 2020-12-28 16:54

    You can avoid the toString() on the Enum by doing this

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

    Works for JDBC driver postgresql 42.2.5

    0 讨论(0)
提交回复
热议问题