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());
我不能相信这个答案,因为你已经解决了它,但我会解释为什么它有效。
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
在 Postgres 中,您可以向现有的类型添加强制转换(在数据库视图中,请参阅 your_database >> 数据库对象 >> 强制转换)
您已经做过类似的事情
CREATE TYPE my_type AS enum ('SOME', 'OTHER');
你也应该这样做
CREATE CAST (character varying AS my_type) with inout as assignment;