2017-11-03 7 views
1

これは重複した質問ですが、他のページの他の解決策は私のために働いていません。Spring JDBCTemplateを使用してデータベーステーブルに新しいレコードを挿入した後に生成されたIDを取得する方法は?

私はOracleデータベースを持っており、挿入されたレコードID(プライマリキー)をフェッチしたいと思いますが、できません。以下はエラーと私のコードです。

org.springframework.dao.DataRetrievalFailureException:生成 キーがサポートされ、数値型ではありません。私は、デバッグモードでアプリケーションを実行すると、私はホルダー変数キーリストの値を見ている[java.lang.Number型]

String query = "INSERT INTO JOBS (USERNAME, CREATED_ON, STATUS, JOBTYPE, DATA) " + "VALUES (?, ?, ?, ?, ?)"; 

try { 

KeyHolder holder = new GeneratedKeyHolder(); 

jdbcTemplate.update(new PreparedStatementCreator() { 

    @Override 
    public PreparedStatement createPreparedStatement(Connection con) throws SQLException { 
    PreparedStatement ps = con.prepareStatement(query, Statement.RETURN_GENERATED_KEYS); 
    ps.setString(1, "username"); 
    ps.setTimestamp(2, new Timestamp(System.currentTimeMillis())); 
    ps.setString(3, "status"); 
    ps.setString(4, "jobtype"); 
    ps.setString(5, "job-data"); 

    return ps; 
    } 
}, holder); 
System.out.println("Holder tostring: " + holder.toString()); 
System.out.println("Ran an update statement and got generated key. Key = " + holder.getKey().intValue()); 
System.out.println("Key: " + holder.getKey().longValue()); 
return true; 
} catch (DataAccessException e) { 
System.err.println("Exception thrown inserting record into table. Error: " + e.getMessage()); 
e.printStackTrace(); 
} 

に [は、oracle.sql.ROWID]をキャストすることができません:私は[{ROWID=AAAKy2AAAAALRgdAAD}]挿入されたレコードIDを取得できません。

テーブル・スクリプトを作成します。は、次のとおりです。あなたがcon.prepareStatement(query, Statement.RETURN_GENERATED_KEYS)を使用する場合は、

CREATE TABLE JOBS (
    ID   INTEGER     GENERATED ALWAYS AS IDENTITY(START WITH 1 INCREMENT BY 1), 
    USERNAME VARCHAR2(20)   NOT NULL, 
    CREATEDON TIMESTAMP    NOT NULL, 
    STATUS  VARCHAR2(10)   NOT NULL, 
    JOBTYPE  VARCHAR2(15)    NOT NULL, 
    DATA  VARCHAR2(1000 CHAR)  NOT NULL, 

    PRIMARY KEY(ID) 
); 
+0

IDをINTEGERからNUMBERに変更し、そのIDにシーケンスを使用する必要があります。私はoracleがdata_typeとしてINTEGERを使用しているとは思っていません。カスタムdata_typeとして自分自身でデータベース内に定義しない限り、 – logger

+0

こんにちは@logger、JobsテーブルIDをNumberに変更し、Generated Always ...を削除し、挿入コマンドでID値を追加するには、挿入コマンドでトリガします。それでも私は同じ問題に直面しています。 – Gaurav

答えて

0

OracleのJDBCドライバはid列の値を返しませんが、代わりにそれはROW_ID(特定を識別擬似列を返します。行)を使用して、自分で値を取得できるようにします。

以前のOracleバージョンにはID列がなかったため、以前はOracleドライバがこのようにしていました。

代わりに、使用する必要があります。指定した列の値を返すためにOracleに指示し

con.prepareStatement(query, new String[] { "ID" }); 

を。

関連する問題