2016-10-19 3 views
2

Я вставляю несколько строк в таблицу, используя один оператор 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"); 
} 

Когда я называть getGeneratedKeys(), он возвращает 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. 
} 
Смежные вопросы