2017-08-25 618 views
1

我想創建一個使用java的SQL語句。問題是我使用PostgreSQL提示:您將需要重寫或轉換表達式。列「狀態」是類型的狀態,但表達式是字符變化的

stmt.setString(9, ev.getState().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(); 

回答

2

您正在使用預處理語句 - 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使用嚴格的類型系統 - 並且沒有明確的投射不允許從varchardate,enum,int,...

相關問題