2017-02-03 17 views
0

У меня есть список, который содержит некоторое имя данные:Как удалить строки с updateBatch, если у меня есть список и одно значение для параметров?

List<String> names; //not null, already with values 

И у меня есть одно целое число, которое содержит идентификатор создаваемых имен:

Integer creatorId = 47; 

И, наконец, у меня есть удаление SQL, который, как:

String deleteSql = "DELETE FROM persons WHERE person_name = ? and creator_id = ?"; 

Дело здесь, чтобы использовать метод updateBatch с весны, и НЕ иСПОЛЬЗОВАТЬin пункт в удалении sql для person_name-s и избегатьfor циклы.

Есть ли способ, чтобы использовать некоторые методы партии здесь? Спасибо!

+0

Любые причины, по которым вы не можете использовать цикл или предложение 'in'? – Thomas

+0

это какая-то цель в моей работе, сделать это с помощью партии, а не в статье. но если это невозможно, то я могу сделать это по-другому. так можно ли это делать с партией или нет? – victorio

+0

Я не знаком с Spring, но вам нужно либо создать один запрос, используя in-clause, либо создать пакет запросов с помощью цикла. Я сомневаюсь, что вы можете разумно сделать это без одного из них (вы могли бы что-то сделать с рекурсией, но почему?). Я также сомневаюсь в том, что вы избегаете этих без уважительной причины, не имеет смысла с деловой точки зрения. – Thomas

ответ

0

Решение:

public void delete(List<String> names, Integer creatorId) { 
    List<Object[]> batchArgs = new ArrayList<>(); 
    for (String name : names) { 
     batchArgs.add(new Object[] { name, creatorId }); 
    } 
    jdbcTemplate.batchUpdate("DELETE FROM persons WHERE person_name = ? and creator_id = ?", batchArgs); 
} 
+0

Хм, это использование цикла for. Разве ваше требование не избегать? – Thomas

1

Поскольку вы добавили «весна-пакетное» тег в эти вопросы, вот как сделать это с пружинным порционной JdbcItemWriter:

JdbcBatchItemWriter<T> writer = new JdbcBatchItemWriter<>(); 

    writer.setDataSource(ds); 
    writer.setSql("DELETE FROM persons WHERE person_name = ? and creator_id = ?"); 
    writer.setItemPreparedStatementSetter((dto, ps) -> { 
     ps.setString(dto.getPersonName()); 
     ps.setInt(dto.getCreatorId()); 
    }); 

    writer.afterPropertiesSet(); 

Этот путь , вы уверены, что вся обработка транзакций соответствует весеннему пакету, и, кроме того, jdbcItemWriter использует методы пакетной обработки.

 Смежные вопросы

  • Нет связанных вопросов^_^