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

推荐答案

您使用的是准备好的语句——PostgreSQL从客户端获取信息,所以参数是varchar,因为您使用的是setString方法.您应该通知Postgres,所以输入数据类型与显式cast不同.

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

所有数据都以文本形式传递(这是默认值)——因此传递的值没有问题.PostgreSQL使用严格的类型系统——如果没有显式转换,则不允许从varchar转换到dateenumint...

Postgresql相关问答推荐

Select 所有数组类型和维度

在 Postgres 中,部分索引比普通索引需要更多的时间和成本来执行

错误:用户需要系统密码:postgres

为什么我的唯一索引在 Postgresql 中不起作用?

数据库所有者无法授予 Select 权限

PostgreSQL临时文件的误解

至少 pgRouting 的某些部分可以与并行查询并行运行吗?

使用 JDBC 连接到 PostgreSql 的本地实例

Psycopg2 在大型 Select 查询中耗尽内存

PostgreSQL 中基于时间戳的移动平均线

在执行 postgresql 函数时提交事务

在 CentOS 上安装 psycopg2 时遇到问题

timezone date_trunc 函数

为什么 PostgreSQL 数组访问在 C 中比在 PL/pgSQL 中快得多?

丢弃顺序和级联

在 Postgresql 中拆分逗号分隔的字段并对所有结果表执行 UNION ALL

如何使用 WITH RECURSIVE 子句进行 Select

每个数据库提供程序类型允许的最大参数数是多少?

错误:prepared statement "S_1" already exists

SQLAlchemy 声明式:定义触发器和索引 (Postgres 9)