簡體   English   中英

java 枚舉和 postgresql 枚舉

[英]java enum and postgresql enum

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 gender but expression is of type character varying 提示:您將需要重寫或轉換表達式。

我的 Java 代碼如下所示:

PreparedStatement pre_state;

public enum gendertype {
    F,
    M;
}

pre_state = conn.prepareStatement("INSERT INTO"
            + " customers VALUES(?, ?, ?, ?, ?, ?, ?, ?, ?, ?, ?)");
pre_state.set(6, gendertype.F.toString());

我不能相信這個答案,因為你已經解決了它,但我會解釋它為什么有效。

PostgreSQL 在它說的時候提供了答案

提示:您需要重寫或強制轉換表達式

Java 代碼正在創建一個字符串文字值,該值表示 Java 枚舉性別類型類型。

將文字轉換為 PostgreSQL 性別類型是通過向值::gender添加轉換后綴來完成的。

所以有效的輸入將是

'F'::gender

要么

'M'::gender

這是有效的,因為所有 PostgreSQL 類型都有一個輸入方法,它采用文本表示並將其轉換為內部形式。

你的解決方案本來是

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

除了其他答案,如果您使用例如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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM