2017-08-25 217 views
1

javaを使用してSQL文を作成しようとしています。問題は、私は、私はそれが私にPostgreSQLヒント:式を書き換えたり、キャストしたりする必要があります。 "state"列はstatus型ですが、式は可変文字型です

column "state" is of type status but expression is of type character varying 
Hint: You will need to rewrite or cast the expression. 

の例外がスローされ

CREATE TYPE STATUS AS ENUM ('APPROVED', 'CLOSED','STARTED', 'WAITING'); 

タイプの状態のSQL列に挿入しようとしている変数の

stmt.setString(9, ev.getState().status()); 

を使用していますされませんでした私は間違いを犯すか、実際には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は、クライアント側からの情報を取得するので、あなたがsetStringメソッドを使用しているので、パラメータがvarcharです。 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、...

関連する問題