jdbcTemplate batchUpdate抛出ClassCastException

时间:2017-01-09 23:43:05

标签: java mysql spring jdbctemplate

我想使用jdbcTemplate将多条记录插入mysql数据库,所以我选择使用batchUpdate方法,这是我的代码:

        @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 个答案:

答案 0 :(得分:0)

最后我注意到我的问题是json输入的格式和json的解析,所以当我将列表转换为json时,我使用以下代码:

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的日期就是25 8月,2016所以gson不知道如何转换该列表,然后我使用gsonBuilder指定日期格式并且工作完美,希望这有助于某人。