我正在尝试使用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条答案
按热度按时间xcitsw881#
你使用的是Prepared Statements - PostgreSQL从客户端获取信息,所以参数是
varchar
,因为你使用的是setString
方法。你应该用显式的类型转换来通知Postgres,这样输入的数据类型就不同了。所有数据都以文本形式传递(这是默认的)-所以这不是传递值的问题。PostgreSQL使用严格的类型系统-并且没有显式转换不允许从
varchar
转换为date
,enum
,int
,...roqulrg32#
如果你使用DBeaver,你一定会遇到同样的问题。
尝试:
1.右键单击你的postgres数据库
2.编辑连接/常规/数据库
3.将数据库更改为要在其上下文中进行更改的基
f1tvaqid3#
不能在枚举类型字段中存储字符串。您需要使用setObject方法并提供如下类型
qnyhuwrf4#
谢谢帕维尔·斯特胡尔
如果我们想添加日期和时间,我们应该使用下面的表达式。