Перечисления Java & Postgres - как заставить их работать вместе для обновления?

acttype - это enumcs, поэтому вы не можете вставить его как обычную строку без приведения к enumcs INSERT INTO dir_act (actcode,actname,acttype,national_code) VALUES (?,?,?::enumcs,?)

Где, что касается обновления, я пытался с тем же типом вставки, как показано ниже, но это не работает.

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

5 ответов

С точки зрения JDBC, просто относитесь к перечислению PostgreSQL как к строке.

Цитирование блога Преобразование между перечислениями Java и перечислениями PostgreSQL:

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 проста. Например, чтобы вставить или обновить поле enum, вы можете использовать синтаксис CAST в вашем 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 также позволит вам вставить / обновить перечисление, просто передав его значение в виде строки.

Будь то приведение или нет, сторона 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() в Enum, сделав это

    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, просто укажите Types.OTHER как явный тип с использованием JdbcTemplate, например:

      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)
);
Другие вопросы по тегам