简体   繁体   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)
)

I have this table and I created an enum of gender such as:我有这张表,我创建了一个性别枚举,例如:

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

I am trying to insert into customers data from eclipse java with PreparedStatement but there is an error such as ERROR: column "gender" is of type gender but expression is of type character varying Hint: You will need to rewrite or cast the expression.我正在尝试使用 PreparedStatement 将来自 eclipse java 的客户数据插入到客户数据中,但出现错误,例如 ERROR: column "gender" is of type gender but expression is of type character varying 提示:您将需要重写或转换表达式。

My Java code looks like:我的 Java 代码如下所示:

PreparedStatement pre_state;

public enum gendertype {
    F,
    M;
}

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

I can take no credit for this answer as you have already solved it, but I will explain why it works.我不能相信这个答案,因为你已经解决了它,但我会解释它为什么有效。

PostgreSQL provides the answer when it says PostgreSQL 在它说的时候提供了答案

Hint: You will need to rewrite or cast the expression提示:您需要重写或强制转换表达式

The Java code is creating a string literal value that represents the Java enum gendertype type. Java 代码正在创建一个字符串文字值,该值表示 Java 枚举性别类型类型。

Casting a literal to a PostgreSQL gender type is done by adding a casting suffix to the value ::gender .将文字转换为 PostgreSQL 性别类型是通过向值::gender添加转换后缀来完成的。

So valid input would be所以有效的输入将是

'F'::gender

or要么

'M'::gender

This works because all PostgreSQL types have a input method that takes a text representation and converts that to the internal form.这是有效的,因为所有 PostgreSQL 类型都有一个输入方法,它采用文本表示并将其转换为内部形式。

你的解决方案本来是

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

In addition to other answers if you use for example createNativeQuery() you should cast value to your enum like cast(? as gender) , something like that:除了其他答案,如果您使用例如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