【问题标题】:Inserting into custom SQL types with prepared statements in java在 java 中使用准备好的语句插入自定义 SQL 类型
【发布时间】:2012-05-21 06:11:35
【问题描述】:

我有一些自定义类型。它们基本上都是枚举。以下是它们的外观示例:

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

我在 Java 中有一些准备好的语句,看起来像这样:

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

Java 给了我一些像这样的讨厌的异常:

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.

他们很高兴给我一个提示,但我不知道具体该怎么做。

【问题讨论】:

  • 如果您可以控制架构,则文本列上的检查约束可以像枚举一样工作,但在 Java 中更容易使用。

标签: java sql postgresql prepared-statement


【解决方案1】:

您是否尝试将列强制转换为枚举?

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

在“A web coding blog”的Convert between Java enums and PostgreSQL enums文章中解释:

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, ?);

【讨论】:

  • 正是我需要的。以前没有在 SQL 中使用过强制转换。谢谢!
【解决方案2】:

另一种方法是

st.setObject(1, 'spades', Types.OTHER);

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-03-02
    • 2016-03-07
    • 1970-01-01
    • 1970-01-01
    • 2016-04-10
    • 1970-01-01
    相关资源
    最近更新 更多