insertした時のidを取得する その2
一応こんなこともできるというご紹介で、前回は1レコードだけinsertしたIDを取得する処理でしたが、今回は複数レコード対応です。
insert select で複数レコード登録した際に、それらのIDがListで返ってきます。
Dao017.java
public interface Dao018 { @SqlUpdate("CREATE TABLE IF NOT EXISTS table004 (name text)") void createTable(); @SqlUpdate("insert into table004 (name) values (:name)") int insert(@Bind("name") String name); @SqlUpdate("insert into table003(name) select name from table004") @GetGeneratedKeys List<Integer> insertSelect(); }
Sample027.java
public static void main(String[] args) { String url = "jdbc:postgresql://192.168.52.128/jdbi"; DBI dbi = new DBI(url, "jdbi_user", "jdbi_pass"); Dao018 dao = dbi.onDemand(Dao018.class); dao.createTable(); dao.insert("name1"); dao.insert("name2"); // Daoに指定するのはダメみたい try { List<Integer> ids = dao.insertSelect(); // JDBI 2.59 ではここで例外 for( Integer id : ids ) { System.out.println("id = " + id); } } catch(Throwable e) { e.printStackTrace(); } // でも、Update オブジェクトから executeAndReturnGeneratedKeys を呼べばOK dbi.withHandle(new HandleCallback<Void>() { @Override public Void withHandle(Handle h) throws Exception { String sql = "insert into table003(name) select name from table004"; Update updateStatement = h.createStatement(sql); List<Integer> ids = updateStatement.executeAndReturnGeneratedKeys(IntegerMapper.FIRST).list(); for( Integer id : ids ) { System.out.println("id = " + id); } return null; } }); }
ソースを見てもらえればわかる通り、ObjectAPI形式の GetGeneratedKeys アノテーションではダメみたいです。
でも、JDBIのソース(V 2.59)を見ると、
@Override public <ContainerType> ContainerType list(Class<ContainerType> containerType) { // return containerFactoryRegistry.lookup(containerType).create(Arrays.asList(list())); throw new UnsupportedOperationException("Not Yet Implemented!"); }
となってまして、対応する気はあるみたいです。