Comment effectuer une mise à jour par lots au printemps avec une liste de cartes?
Nouveau pour le Printemps, je suis en train d'insérer une List<Map<String, Object>>
dans une table. Jusqu'à maintenant, j'ai été en utilisant le SqlParameterSource
pour la mise à jour par lot, ce qui fonctionne le mieux quand un haricot de java est fourni. Quelque chose comme ceci:
@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;
}
Cependant, j'ai essayé la même technique avec une liste de cartes à la place d'un haricot, il n'a pas (à juste titre).
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;
}
Le code ci-dessus a échoué avec l'exception suivante:
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)
Il échoue car il considère que la liste des lots de haricots, je suppose. Je ne peux pas trouver un moyen pour effectuer une mise à jour par lot de Printemps avec la une liste de cartes et à l'aide de NamedParameterJDBCTemplate
. S'il vous plaît conseils.
source d'informationauteur Rickesh John
Vous devez vous connecter pour publier un commentaire.
Comme par Ressort
NamedParameterJDBCTemplate
docs, trouvé icicette méthode peut être utilisée pour un lot de mise à jour des cartes.int[] batchUpdate(String sql, Map<String,?>[] batchValues)
Le vrai défi était d'obtenir un tableau de
Map<String, Object>
à partir d'un correspondantList<Map<String, Object>>
. J'ai utilisé le code suivant pour obtenir le tableau et effectuer la mise à jour par lot.