2016-10-19 10 views
2

1つのinsert文を使用して複数の行をテーブルに挿入しています。テーブルには、プライマリキーとしての自動増分フィールドがあります。複数の値を持つ単一のinsert文から生成されたキーを取得する

ようなので:INSERT INTO MyTable VALUES (?,?,?,?),(?,?,?,?),(?,?,?,?),(?,?,?,?)

StringJoiner sj = new StringJoiner(","); 
for(int i=0;i<salesmen.size();i++) 
    sj.add("(?,?,?,?)"); 

sql.append("INSERT INTO MyTable "); 
sql.append("VALUES "); 
sql.append(sj.toString()); 

try(PreparedStatement statement = connection.prepareStatement(sql.toString(),Statement.RETURN_GENERATED_KEYS)){ 
    int i = 1; 
    for(Salesman salesman : salesmen){ 
     statement.setDate(i++, DateUtil.toSqlDate(date)); 
     statement.setString(i++, salesman.getName()); 
     statement.setInt(i++, salesman.getWeeklyTargetCustomerId()); 
     statement.setInt(i++, salesman.getCycle()); 
    } 
    statement.executeUpdate(); 

    ResultSet generatedKeys = statement.getGeneratedKeys(); 
    while(generatedKeys.next()) { 
     log.info("generated key: " + generatedKeys.getLong(1)); //only prints 1 id 
    } 
} 
catch(SQLException e){ 
    log.info("(!!) SQL Exception in Execution: " + e.getMessage()); 
    log.info("\n\n" + sql.toString() + "\n"); 
} 

iはgetGeneratedKeys()を呼び出すと、それが挿入された最後の行のIDのみでResultSetを返し、全ての行。 50行挿入すると、生成された50個のキーでどのように結果セットを取得できますか?

+0

私はあなたと同じ状況でそれを解決していますか? –

答えて

0

古い質問ですが、誰かを助けることを願っています。

PreparedStatement pre = connection.prepareStatement("SQL", PreparedStatement.RETURN_GENERATED_KEYS); 
for(Salesman salesman: salesmen) { 
    pre.setString(i++, ...); 
    pre.setString(i++, ...); 
    .... 
    pre.addBatch(); // Add this 
} 
pre.executeBatch(); // Add this 
ResultSet rs = pre.getGeneratedKeys(); 
while(rs.next()) { 
    int id = rs.getInt(1); // This should contain the id of the inserts in order. 
} 
関連する問題