2013-07-02 9 views
13

Springに新しく、List<Map<String, Object>>をテーブルに挿入しようとしています。これまではバッチ更新のためにSqlParameterSourceを使用していましたが、これはJava Beanが供給されたときに正常に動作します。このような何か:マップリストを使ってSpringでバッチ更新を実行するには?

@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; 

     } 

しかし、私は豆の代わりに、マップのリストと同じ手法を試してみました、それは(当然のように)失敗しました。

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; 

    } 

上記のコードは次の例外で失敗しました:それは豆のバッチであることをリストを考慮してそれが失敗した

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) 

、私は推測します。私はのマップでのリストとNamedParameterJDBCTemplateを使用して、バッチでバッチ更新を実行する方法を見つけることができません。ご意見をお聞かせください。

答えて

6

hereのように、NamedParameterJDBCTemplateドキュメントの場合、このメソッドはマップを使用したバッチ更新に使用できます。

int[] batchUpdate(String sql, Map<String,?>[] batchValues)

本当challangeは、対応するList<Map<String, Object>>からMap<String, Object>の配列を取得しました。私は配列を取得し、バッチ更新を実行するために、次のコードを使用しました。

public static Map<String, Object>[] getArrayData(List<Map<String, Object>> list){ 
     @SuppressWarnings("unchecked") 
     Map<String, Object>[] maps = new HashMap[list.size()]; 

     Iterator<Map<String, Object>> iterator = list.iterator(); 
     int i = 0; 
     while (iterator.hasNext()) { 
      Map<java.lang.String, java.lang.Object> map = (Map<java.lang.String, java.lang.Object>) iterator 
        .next(); 
      maps[i++] = map; 
     } 

     return maps; 
    } 
+0

Map [] batchValuesではなく、なぜ [] batchValues'マップを持っていますか? – fastcodejava

+3

このようにして成功した場合: Map [] batchValues = list.toArray(new HashMap [0]); namedParameterJdbcTemplate.batchUpdate( "..."、batchValues); –

関連する問題