JDBCでINSERT後のシーケンス値を取得する
idカラムを作って自動採番するような場合。
JPAでINSERTすればidが入った状態でEntityが取れるけど、JDBCの場合にどうするか。
何故にJDBCかというと、バイナリデータを放り込むのにJPAではなくJDBCを使いたいから。
PostgreSQLのbyteaカラムに手動でデータを入れる - edgegram
参考:java - PreparedStatement with Statement.RETURN_GENERATED_KEYS - Stack Overflow
Statement.RETURN_GENERATED_KEYSを引数に追加すればできる。
Stetement使う(人が今どきいるか?)場合はexecuteUpdate()の第2引数、PreparedStatementならprepareStatement()で指定する。
PreparedStatement ps = con.prepareStatement("INSERT INTO binary_tbl (value) VALUES (?)", Statement.RETURN_GENERATED_KEYS); ps.setBinaryStream(1, fis, (int)file.length()); ps.executeUpdate();
その後、PreparedStatement(or Statement)からgetGeneratedKeys()すれば、自動採番されたシーケンス値の一覧がResultSetで返ってくる。
ResultSet rs = ps.getGeneratedKeys(); if (rs != null && rs.next()) { long id = rs.getLong(1); }
Statement.RETURN_GENERATED_KEYSの代わりにカラム名のString配列を指定しておけばカラム名で取れる。
PreparedStatement ps = con.prepareStatement("INSERT INTO binary_tbl (value) VALUES (?)", new String[]{"id"}); ・・・ long id = rs.getLong("id");
あまりしないと思うが、1テーブル複数シーケンスとかの場合はカラム指定の方が分かりやすい。
Java8 + PostgreSQL9.4