2017-02-03 1 views
0

Ich habe eine Liste, die einige Namensdaten enthält:Wie lösche ich Zeilen mit updateBatch, wenn ich eine Liste und einen einzigen Wert für Parameter hatte?

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

Und ich habe eine einzelne ganze Zahl, die die ID des erzeugten Namen enthält:

Integer creatorId = 47; 

Und schließlich habe ich die löschen sQL, die wie ist:

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

Der Punkt hier ist die updateBatch Methode von Spring zu verwenden, und NICHT vERWENDENin Klausel im Löschen sql für person_name-s und vermeidenfor Schleifen.

Gibt es eine Möglichkeit, einige Batch-Methoden hier zu verwenden? Vielen Dank!

+0

Gibt es Gründe, warum Sie keine Schleife oder In-Klausel verwenden können? – Thomas

+0

das ist ein Zweck in meinem Job, es mit Batch zu tun, und nicht in Klausel. aber wenn es nicht möglich ist, dann kann ich es anders machen. also ist es möglich, es mit Batch oder gar nicht zu tun? – victorio

+0

Ich bin nicht so vertraut mit Spring, aber Sie müssten entweder eine einzelne Abfrage mit einem In-Klausel erstellen oder einen Stapel von Abfragen erstellen, indem Sie eine Schleife verwenden. Ich bezweifle, dass Sie vernünftig tun können, ohne eines von denen (Sie könnten etwas mit Rekursion abziehen, aber warum?). Ich würde auch bezweifeln, dass es ohne einen guten Grund zu vermeiden ist, dass es aus geschäftlicher Sicht keinen Sinn ergibt. – Thomas

Antwort

0

Die Lösung lautet:

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

Hmm, das ist eine For-Schleife. War es nicht Ihre Pflicht, sie zu vermeiden? – Thomas

1

Da Sie "spring-batch" Tag auf diese Fragen hinzugefügt, hier ist, wie es mit einem feder Batch JdbcItemWriter zu tun:

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(); 

Auf diese Weise Sie sind sicher, dass die gesamte Transaktionsverarbeitung nach Spring-Batch erfolgt, und darüber hinaus verwendet jdbcItemWriter batchupdate-Methoden.

Verwandte Themen