java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class ...

yoondgu·2022년 8월 17일
0

오류 기록

목록 보기
7/10
post-thumbnail
java.lang.ClassCastException: class java.math.BigDecimal cannot be cast to class java.lang.Integer
(java.math.BigDecimal and java.lang.Integer are in module java.base of loader 'bootstrap')

mybatis에서 resultType을 map으로 값을 가져와서 작업 중에 위와 같은 cast 에러가 발생했다.
여러행을 조회하느라 List<Map<String,Integer>>를 mapper 메소드의 반환타입으로 지정해놓고
해당 map들을 꺼내서 dto객체에 알맞게 저장해주어야 했다.
그 과정에서 value를 꺼내면서 위와 같은 예외가 발생했다.

오라클에서 데이터타입이 number형이면 형변환 시 에러가 발생할 수 있다고 한다.
BigDecimal 객체를 Integer로 형변환할 수 없다는 것이다.
(나 같은 경우 value는 sql에서 count(*)로 집계한 값이었다.)

그래서 String.valueOf()는 문자열로의 변환을 폭넓게 지원하므로(?)
아래처럼 String으로 형변환해준 뒤, 파싱을 해주면 이제는 에러가 발생하지 않는다.

Integer.parseInt(String.valueOf(기존값))

처음에는 어차피 String으로 바꿀 거면 sql에서 숫자를 String으로 받으면 되는 거 아닌가? 싶어서
List<Map<String,String>>으로 반환타입을 지정하고 Integer.parseInt만 시켜봤는데
이번에는 같은 예외에 String 클래스로 형변환이 불가능하다는 에러메시지가 떴다.
반환타입을 지정해놔도 어쨌든 형변환이 안되는 BigDecimal 객체..?로 값이 들어오는 것 같다.

그동안 mybatis로 조회할 때는 기본자료형인 int로 값을 받으니까 문제가 없었고
이번에는 wrapper 클래스를 써야해서 겪어보게 된 문제인듯.

0개의 댓글