2017-01-09 66 views
-1

我想插入使用的JdbcTemplate多個記錄到MySQL數據庫,所以我選擇使用BATCHUPDATE方法,這是我的代碼:的JdbcTemplate BATCHUPDATE拋出ClassCastException異常

 @Override 
public void actualizarAmortizaciones(List<Amortizacion> lstAmortizaciones) { 
    jdbcTemplate.batchUpdate("{call contable.spact_amortizaciones(?,?,?,?,?,?,?,?,?,?)}", new BatchPreparedStatementSetter() { 

     @Override 
     public void setValues(PreparedStatement ps, int i) throws SQLException { 
      Amortizacion objAmortizacion = lstAmortizaciones.get(i); 
      ps.setString(1, objAmortizacion.getStrId()); 
      ps.setString(2, objAmortizacion.getStrTarjeta()); 
      ps.setInt(3, objAmortizacion.getIntNumeroAmortizacion()); 
      ps.setDate(4, (Date) objAmortizacion.getDatFechaPago()); 
      ps.setString(5, objAmortizacion.getStrHoraPago()); 
      ps.setInt(6, objAmortizacion.getIntCubierto()); 
      ps.setBigDecimal(7, objAmortizacion.getBdTotalPagado()); 
      ps.setBigDecimal(8, objAmortizacion.getBdCapitalPagado()); 
      ps.setBigDecimal(9, objAmortizacion.getBdInteresPagado()); 
      ps.setBigDecimal(10, objAmortizacion.getBdIvaPagado()); 
     } 

     @Override 
     public int getBatchSize() { 
      return lstAmortizaciones.size(); 
     } 
    }); 
} 

下一行拋出一個錯誤

Amortizacion objAmortizacion = lstAmortizaciones.get(i); 

這是錯誤:

java.lang.ClassCastException: com.google.gson.internal.LinkedTreeMap cannot be cast to com.bo.Amortizacion 
    at com.dao.impl.TransaccionDAO$1.setValues(TransaccionDAO.java:49) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:956) 
    at org.springframework.jdbc.core.JdbcTemplate$4.doInPreparedStatement(JdbcTemplate.java:946) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:629) 
    at org.springframework.jdbc.core.JdbcTemplate.execute(JdbcTemplate.java:658) 
    at org.springframework.jdbc.core.JdbcTemplate.batchUpdate(JdbcTemplate.java:946) 
    at com.dao.impl.TransaccionDAO.insertarAmortizaciones(TransaccionDAO.java:44) 

有人知道這是爲什麼發生?,

在此先感謝。

更新

我得到的名單從JSON解析(我使用GSON)用下面的代碼:

@SuppressWarnings("unchecked") 
@RabbitListener(queues = "generarAmortizacionesContable") 
public void generarAmortizaciones(String json){ 
    Gson gson = new Gson(); 
    List<Amortizacion> lstAmortizaciones = gson.fromJson(json, List.class); 
    transaccionBS.insertarAmortizaciones(lstAmortizaciones); 
} 

但我注意到,當我調試我的代碼列表中包含LinkedTreeMapElements所以我不知道這是否是一個好的行爲

+1

什麼是'lstAmortizaciones'的類型,你從哪裏得到這個列表? –

+0

讓我更新我的問題來更好地解釋我自己,知道你可以看到我的改變 –

回答

0

最後我發現我的問題是json輸入的格式和該json的解析,所以當我將列表轉換爲json時,我使用以下鱈魚E:

List<Amortizacion> lstAmortizaciones = amortizacionDAO.generarAmortizaciones(objTransaccion); 
Gson gson = new GsonBuilder().setDateFormat(DateFormat.FULL, DateFormat.FULL).create(); 
String json = gson.toJson(lstAmortizaciones); 

而當我需要的JSON轉換到列表中我使用此代碼:

Type listType = new TypeToken<List<Amortizacion>>() {}.getType(); 
List<Amortizacion> lstAmortizaciones = new GsonBuilder().setDateFormat(DateFormat.FULL, DateFormat.FULL).create().fromJson(json, listType); 

所以問題是,解析了列表轉換爲LinkedTreeMap列表,所以當我決定使用TypeToken類,它會拋出一個有關日期格式的錯誤,因爲列表轉換爲json的日期是像2016年8月25日這樣的日期,因此gson不知道如何轉換該列表,然後使用指定的日期格式gsonBuilder和完美的作品,希望這可以幫助別人。