Невозможно получить объект из базы данных H2: ClassCastException при получении - PullRequest
0 голосов
/ 19 февраля 2019

Я использую базу данных H2 для хранения и извлечения пользовательского объекта вместе с некоторыми другими столбцами с данными String.

Я могу успешно сохранить их, но когда я пытаюсь получить объект обратно иприведение к моему пользовательскому объекту. Выдает ошибку:

java.lang.ClassCastException: package.CustomObject не может быть приведен к package.CustomObject

IЯ использую шаблон JDBC для получения данных из базы данных H2.Ниже моя конфигурация:

@Configuration
public class H2Config {

@Value("${jdbc.url}")
private String jdbcUrl;

@Value("${jdbc.driver}")
private String jdbcDriver;

@Value("${jdbc.username}")
private String jdbcUserName;

@Value("${jdbc.password}")
private String jdbcPassword;

@Bean
public DataSource dataSource() {
    DataSource dataSource = DataSourceBuilder.create().driverClassName(jdbcDriver).url(jdbcUrl)
            .username(jdbcUserName).password(jdbcPassword).build();
    return dataSource;
}

@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource) {
    return new JdbcTemplate(dataSource);
}

}

Ниже приведены способы, которые я использую для извлечения объекта из базы данных:

    @Autowired
JdbcTemplate jdbcTemplate; 

///////////////////// Way 1 //////////////////////////

public List<HashMap<String,Object>> getAllRetryObjOT(int startSeq, int endSeq) {
    String getAllObjs = "select type,obj from Retry where seq between " + startSeq + " and " + endSeq;
    List<Map<String, Object>> retryListMap = null;
    List<HashMap<String,Object>> retryList = new ArrayList<HashMap<String,Object>>();
    try {
        retryListMap = jdbcTemplate.queryForList(getAllObjs);
    } catch (Exception e) {
        logger.error(e);
    }
    for (Map<String, Object> retryMap : retryListMap) {
        retryList.add(new HashMap<String,Object>(){{
                put("type",(String) retryMap.get("type"));
                put("obj",retryMap.get("obj"));
                }});
    }
    return retryList;
}

///////////////////// Way 2 //////////////////////////

public List<HashMap<String,CustomObject>> getAllRetry(int startSeq, int endSeq){
    String getAllObjs = "select * from Retry where seq between ? and ?";
    List<HashMap<String,CustomObject>> retryList = new ArrayList<HashMap<String,CustomObject>>();

    retryList=jdbcTemplate.execute(getAllObjs,new PreparedStatementCallback<List<HashMap<String, CustomObject>>>() {
        @Override
        public List<HashMap<String, CustomObject>> doInPreparedStatement(PreparedStatement ps) throws SQLException, DataAccessException {
            List<HashMap<String, CustomObject>> retryListMap = new ArrayList<HashMap<String,CustomObject>>();
            ps.setInt(1, startSeq);
            ps.setInt(2, endSeq);
            ResultSet rs=ps.executeQuery();
            while(rs.next()){
                HashMap<String,CustomObject> retryObj=new HashMap<String,CustomObject>();
                CustomObject custObj=new CustomObject();
                custObj=(CustomObject)rs.getObject("obj");
                retryObj.put(rs.getString("type"), custObj);
                retryListMap.add(retryObj);
            }
            return retryListMap;
        }
    });
    return retryList;
}

///////////////////// Way 3 //////////////////////////

public List<HashMap<String,CustomObject>> getAllRetryObj(int startSeq, int endSeq) {
    String getAllObjs = "select * from Retry where seq between ? and ?";
    List<HashMap<String, CustomObject>> retryListMap = null;
    List<HashMap<String,Object>> retryList = new ArrayList<HashMap<String,Object>>();

    try {
        retryListMap = jdbcTemplate.query(new PreparedStatementCreator() {
            @Override
            public PreparedStatement createPreparedStatement(Connection connection) throws SQLException {
                PreparedStatement ps = connection.prepareStatement(getAllObjs);
                ps.setInt(1, startSeq);
                ps.setInt(2, endSeq);
                return ps;
            }
        }, new ResultSetExtractor<List<HashMap<String, CustomObject>>>() {
            @Override
            public List<HashMap<String, CustomObject>> extractData(ResultSet rs) throws SQLException, DataAccessException {
                List<HashMap<String, CustomObject>> retryListMap = new ArrayList<HashMap<String,CustomObject>>();
                while(rs.next()){
                    HashMap<String,CustomObject> retryObj=new HashMap<String,CustomObject>();
                    Object custObj=rs.getObject("obj");
                    retryObj.put(rs.getString("type"),(CustomObject) custObj);
                    retryListMap.add(retryObj);
                }
                return retryListMap;
            }
        });
    } catch (Exception e) {
        logger.error(e);
    }

    return retryListMap;
}

В любой заданной точкеЧерез некоторое время после выполнения запроса, когда я пытаюсь привести объект, полученный из столбца "obj", к моему CustomObject, он выдает ClassCastException, как упомянуто выше.Мой класс CustomObject - Serializable (что видно по тому, что мне удалось его сохранить).

При просмотре в режиме отладки я обнаружил, что извлеченный объект уже имел тип CustomObject, как показано в разделе «Переменные» Eclipse.Я понятия не имею, как идти дальше, и я полностью застрял в этом.Пожалуйста помоги.Спасибо.

...