これは重複した質問ですが、他のページの他の解決策は私のために働いていません。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)
);
IDをINTEGERからNUMBERに変更し、そのIDにシーケンスを使用する必要があります。私はoracleがdata_typeとしてINTEGERを使用しているとは思っていません。カスタムdata_typeとして自分自身でデータベース内に定義しない限り、 – logger
こんにちは@logger、JobsテーブルIDをNumberに変更し、Generated Always ...を削除し、挿入コマンドでID値を追加するには、挿入コマンドでトリガします。それでも私は同じ問題に直面しています。 – Gaurav