Java PostgreSQL提示:您需要重写或强制转换表达式。栏「;“国家”;类型为status,但表达式类型为character variable
我正在尝试使用java创建SQL语句。问题是我正在使用Java PostgreSQL提示:您需要重写或强制转换表达式。栏「;“国家”;类型为status,但表达式类型为character variable,java,postgresql,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 v
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();
您正在使用准备好的语句-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
强制转换到date
,enum
,int
,…,如果使用DBeaver,您一定会遇到同样的问题
尝试:
1.右键单击您的postgres db
2.编辑连接/常规/数据库
3.将数据库更改为要在其上下文中进行更改的基本数据库这将是您的解决方案
stmt.setObject(9, ev.getState().status(), Types.OTHER);
谢谢Pavel Stehule
如果我们想用时间来添加日期,我们应该使用下面的表达式
PreparedStatement stmt = conn.prepareStatement(
"INSERT INTO Event (EventNum, EventName, startHour, endHour, startMin, endMin, startDate, endDate, State, depName)
VALUES (?, ?, ?, ?, ?, ?, ?::timestamp, ?, ?, ?)");
只是想补充一点,如果在SpringJDBC中也使用命名参数,这也可以使用,例如,
:paramName::xml
对我有效:插入学生(id、姓名、年龄、creationTime)值(?,,,,::日期)