PostgreSQL提示:您需要重写或转换表达式。列“state”的类型为status,但表达式的类型为字符变化

时间:2017-08-25 02:25:42

标签: java postgresql

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

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

我想尝试插入类型为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();

4 个答案:

答案 0 :(得分:9)

您正在使用预备语句 - 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使用严格类型系统 - 没有显式强制转换,不允许从varchar投射到dateenumint,......

答案 1 :(得分:0)

如果使用DBeaver,您肯定会有同样的问题。

尝试:

1。右键单击您的postgres数据库

2.edit连接/常规/数据库

3。将数据库更改为要进行更改的基础数据库

答案 2 :(得分:0)

这将是您的解决方法

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

答案 3 :(得分:0)

谢谢,帕维尔·斯图尔,

如果要添加日期和时间,则应使用以下表达式。

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