2017-01-09 42 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和完美的作品,希望这可以帮助别人。