PostgreSQL提示:您需要重写或强制转换表达式,列“state”的类型为status,但表达式的类型为character variable

gfttwv5a  于 2023-06-22  发布在  PostgreSQL
关注(0)|答案(4)|浏览(311)

我正在尝试使用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();
xcitsw88

xcitsw881#

你使用的是Prepared Statements - 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,...

roqulrg3

roqulrg32#

如果你使用DBeaver,你一定会遇到同样的问题。
尝试:
1.右键单击你的postgres数据库
2.编辑连接/常规/数据库
3.将数据库更改为要在其上下文中进行更改的基

f1tvaqid

f1tvaqid3#

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

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

qnyhuwrf4#

谢谢帕维尔·斯特胡尔
如果我们想添加日期和时间,我们应该使用下面的表达式。

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

相关问题