19

I have some custom types. They are all basically enums. Here is an example of what they look like:

CREATE TYPE card_suit AS ENUM
   ('spades',
    'clubs',
    'hearts',
    'diamonds');

And I have some prepared statements in Java, which look something like this:

// Setup stuff up here.
sql = "INSERT INTO foo (suit) VALUES (?)";
st.setString(1, 'spades');
st.executeUpdate(sql);

And Java gives me some nasty exceptions like this:

org.postgresql.util.PSQLException: ERROR: column "suit" is of type card_suit but expression is of type character varying
Hint: You will need to rewrite or cast the expression.

It's nice of them to give me a hint, but I'm not sure exactly how to follow it.

Tom Carrick
  • 6,349
  • 13
  • 54
  • 78
  • 1
    If you have control of the schema, a check constraint on a text column can work the same as the enum, yet is easier to work with in Java. – BillRobertson42 Feb 26 '16 at 21:13

2 Answers2

27

Have you tried to cast column to enum?

// Setup stuff up here.
sql = "INSERT INTO foo (suit) VALUES (?::card_suit)";
st.setString(1, 'spades');
st.executeUpdate(sql);

Explained in Convert between Java enums and PostgreSQL enums article of 'A web coding blog' with samples:

INSERT INTO pet (pet_id, pet_type, name) 
         VALUES (?, CAST(? AS animal_type), ?);

--or

INSERT INTO pet (pet_id, pet_type, name) 
         VALUES (?, ?::animal_type, ?);
dani herrera
  • 48,760
  • 8
  • 117
  • 177
0

Another approach would have been

st.setObject(1, 'spades', Types.OTHER);
abbas
  • 6,453
  • 2
  • 40
  • 36