Я использую базу данных 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.Я понятия не имею, как идти дальше, и я полностью застрял в этом.Пожалуйста помоги.Спасибо.