Neu bei Spring, ich versuche, eine List<Map<String, Object>>
in eine Tabelle einzufügen. Bis jetzt habe ich die SqlParameterSource
für Batch-Update verwendet, die gut funktioniert, wenn eine Java-Bean an sie geliefert wird. Etwas wie folgt aus:Wie führe ich eine Batch-Aktualisierung im Frühling mit einer Liste von Karten durch?
@Autowired
private NamedParameterJDBCTemplate v2_template;
public int[] bulkInsertIntoSiteTable(List<SiteBean> list){
SqlParameterSource[] batch = SqlParameterSourceUtils
.createBatch(list.toArray());
int[] updateCounts = v2_template
.batchUpdate(
"insert into sitestatus (website, status, createdby) values (:website, :status, :username)",
batch);
return updateCounts;
}
Allerdings habe ich die gleiche Technik mit einer Liste von Karten anstelle einer Bean versucht, es scheiterte (zu Recht).
public int[] bulkInsertIntoSiteTable(List<Map<String, Object>> list){
SqlParameterSource[] batch = SqlParameterSourceUtils
.createBatch(list.toArray());
int[] updateCounts = v2_template
.batchUpdate(
"insert into sitestatus (website, status, createdby) values (:website, :status, :username)",
batch);
return updateCounts;
}
Der obige Code ist fehlgeschlagen mit folgenden Ausnahme:
Exception in thread "main" org.springframework.dao.InvalidDataAccessApiUsageException: No value supplied for the SQL parameter 'website': Invalid property 'website' of bean class [org.springframework.util.LinkedCaseInsensitiveMap]: Bean property 'website' is not readable or has an invalid getter method: Does the return type of the getter match the parameter type of the setter?
at org.springframework.jdbc.core.namedparam.NamedParameterUtils.buildValueArray(NamedParameterUtils.java:322)
at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils$1.setValues(NamedParameterBatchUpdateUtils.java:45)
at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:893)
at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:1)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:587)
at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:615)
at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:884)
at org.springframework.jdbc.core.namedparam.NamedParameterBatchUpdateUtils.executeBatchUpdateWithNamedParameters(NamedParameterBatchUpdateUtils.java:40)
at org.springframework.jdbc.core.namedparam.NamedParameterJdbcTemplate.batchUpdate(NamedParameterJdbcTemplate.java:303)
at tester.utitlies.dao.VersionTwoDao.bulkInsertIntoSites(VersionTwoDao.java:21)
at tester.utitlies.runner.Main.main(Main.java:28)
Es schlägt fehl, da es die Liste hält ein Stapel von Bohnen zu sein, glaube ich. Ich kann keinen Weg finden, eine Stapelaktualisierung im Frühling mit eine Liste der Karten durchzuführen und NamedParameterJDBCTemplate
zu verwenden. Bitte um Rat.
Warum haben sie 'Karte [] batchValues' und nicht die Karte [] batchValues? –
fastcodejava
Hatte Erfolg auf diese Weise: Karte [] BatchValues = list.toArray (neue HashMap [0]); namedParameterJdbcTemplate.batchUpdate ("...", BatchValues); –