PostgreSQL 提示:您将需要重写或转换表达式。列“状态”是状态类型,但表达式是字符变化类型

新手上路,请多包涵

我正在尝试使用 java 创建一个 SQL 语句。问题是我正在使用

 stmt.setString(9, ev.getState().status());

对于我试图插入状态类型的 SQL 列的变量

 CREATE TYPE STATUS AS ENUM ('APPROVED', 'CLOSED','STARTED', 'WAITING');

它抛给我一个例外

column "state" is of type status but expression is of type character varying
Hint: You will need to rewrite or cast the expression.

我是犯了错误还是我真的需要在 sql 中转换值?如果是,在这种情况下如何施法?

完整声明:

      PreparedStatement stmt = conn.prepareStatement("INSERT INTO Event (EventNum, EventName, startHour, endHour, startMin, endMin, startDate, endDate, State, depName) VALUES (?, ?, ?, ?, ?, ?, ?::date, ?::date, ?, ?)");

     stmt.setInt(1, ev.getEventNum());
     stmt.setString(2, ev.getName());
     stmt.setInt(3, ev.getStartHour());
     stmt.setInt(4, ev.getEndHour());
     stmt.setInt(5, ev.getStartMinute());
     stmt.setInt(6, ev.getEndMinute());
     stmt.setString(7, ev.getStartYear() + "-" + ev.getStartMonth() + "-" + ev.getStartDate());
     stmt.setString(8, ev.getEndYear() + "-" + ev.getEndMonth() + "-" + ev.getEndDate());
     stmt.setString(9, ev.getState().status());
     stmt.setString(10, ev.getDepartment());

     stmt.executeUpdate();

原文由 Gatiivs 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

您正在使用准备好的语句 - PostgreSQL 从客户端获取信息,因此参数是 varchar 因为您正在使用 setString 方法。您应该通知 Postgres,因此输入数据类型与显式转换不同。

 PreparedStatement stmt = conn.prepareStatement(
  "INSERT INTO Event (EventNum, EventName, startHour, endHour, startMin, endMin, startDate, endDate, State, depName)
               VALUES (?, ?, ?, ?, ?, ?, ?::date, ?::date, ?::status, ?)");

所有数据都以文本形式传递(这是默认的)——所以传递值没有问题。 PostgreSQL uses strict type system - and without explicit casting don’t allow cast from varchar to date , enum , int , .. .

原文由 Pavel Stehule 发布,翻译遵循 CC BY-SA 3.0 许可协议

您不能在枚举类型字段中存储字符串。您需要使用 setObject 方法并提供这样的类型

stmt.setObject(9, ev.getState().status(), Types.OTHER);

原文由 abbas 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题