2013-05-10 188 views
0
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) 
) 

我有这个表,我创建了性别的枚举,如:Java的枚举和PostgreSQL枚举

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

我试图用PreparedStatement的 插入到客户的数据从日食Java,但有一个错误,例如ERROR:列“gender”是性别类型,但表达式的类型是字符变化的 提示:您将需要重写或转换表达式。

我的Java代码如下所示:

PreparedStatement pre_state; 

public enum gendertype { 
    F, 
    M; 
} 

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

它可能将其插入为'F':: text,这会导致错误。 – 2013-05-10 23:59:38

+0

好吧,我找到解决方案,它的工作原理 – user2317288 2013-05-11 00:13:57

+0

pre_state = main.conne.conn.prepareStatement(“insert into customers values(?,?,?,?,?,?:: gender,?,?,?,?,? )“); – user2317288 2013-05-11 00:14:13

回答

4

我可以不采取信用为这个答案,因为你已经解决了这个问题,但我会解释为什么它的工作原理。

PostgreSQL提供了答案的时候,它说

Hint: You will need to rewrite or cast the expression

的Java代码创建代表了Java枚举类型gendertype一个字符串值。

通过将值后缀添加到值::gender来将字面值转换为PostgreSQL性别类型。

所以有效的投入将是

'F'::gender 

'M'::gender 

这工作,因为所有PostgreSQL类型都有,需要一个文本表示和转换一个输入法是为内部形式。