java 枚举和 postgresql 枚举

问题描述 投票:0回答:4
CREATE TABLE customers
(
  first_name character varying(15),
  second_name character varying(20),
  login character varying(15) NOT NULL,
  password character varying(15),
  email character varying(40),
  gender gender,
  register_date date,
  date_of_birth date,
  address character varying(40),
  address_number integer,
  town character varying(20),
  CONSTRAINT login PRIMARY KEY (login)
)

我有这张表,我创建了一个性别枚举,例如:

CREATE TYPE gender AS ENUM ( 'F', 'M',);

我正在尝试使用PreparedStatement从eclipse java插入客户数据 但有一个错误,例如 ERROR: column "gender" is of type sex but expression is of typecharacter Varvaring 提示:您需要重写或转换表达式。

我的 Java 代码如下所示:

PreparedStatement pre_state;

public enum gendertype {
    F,
    M;
}

pre_state = conn.prepareStatement("INSERT INTO"
            + " customers VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
pre_state.set(6, gendertype.F.toString());
java postgresql
4个回答
15
投票

我不能相信这个答案,因为你已经解决了它,但我会解释为什么它有效。

PostgreSQL 给出了答案:

提示:您需要重写或转换表达式

Java 代码正在创建一个表示 Java 枚举性别类型类型的字符串文字值。

将文字转换为 PostgreSQL 性别类型是通过向值添加转换后缀来完成的

::gender

所以有效的输入是

'F'::gender

'M'::gender

这是可行的,因为所有 PostgreSQL 类型都有一个输入方法,它采用文本表示形式并将其转换为内部形式。


2
投票

你的解决方案是

pre_state.setObject(6, gendertype.F.toString(), Types.OTHER);

1
投票

除了其他答案之外,如果您使用例如

createNativeQuery()
,您应该将值投射到您的
enum
,例如
cast(? as gender)
,类似的东西:

Person person = new Person("Gurbanguly", "Berdymukhamedov", Gender.Male)
Session session = HibernateUtil.getSessionFactory().openSession();
Transaction transaction = session.beginTransaction();
session.createNativeQuery("INSERT INTO Person (firstname, lastname, gender) VALUES (?,?,cast(? as gender))")
            .setParameter(1, person.getFirstName())
            .setParameter(2, person.getLastName())
            .setParameter(3, person.getGender().toString())
            .executeUpdate();
transaction.commit();
session.close(); // this statement is needed not to produce many sessions

0
投票

在 Postgres 中,您可以向现有的类型添加强制转换(在数据库视图中,请参阅 your_database >> 数据库对象 >> 强制转换)

您已经做过类似的事情

CREATE TYPE my_type AS enum ('SOME', 'OTHER');

你也应该这样做

CREATE CAST (character varying AS my_type) with inout as assignment;
© www.soinside.com 2019 - 2024. All rights reserved.