mybatis로 datetime 뽑을 때 발생한 에러

배선영·2021년 9월 29일
0

ajax 통신을 통해 데이터를 뽑아와 테이블에 값을 입력 시키는 부분을 손보고 있었다.
mybatis 문법이 아래와 비슷했고 데이터를 뽑아오는데 ajax에서 계속 error 부분이 실행되었다.

<select id="selectDetecteLedgr" resultType="java.util.HashMap" parameterType="java.util.HashMap">
		SELECT 	
				TIME,
				
		FROM 	
		WHERE	TIME = #{TIME}
</select>

ajax error 부분에

error : function( error, data)
		{
			console.log("error : " + error);
            console.log(data)
			alert("Fail to SelectTelegram");
		}

위와 같은 코드를 통해 무슨 에러가 나는지, 데이터가 어떻게 뽑혀오는지 살펴보았다.
에러메시지 는 Unexpected Number in json at position이었는데 당최 뭔지 모르겠으니 넘어가고
문제는 데이터 부분 같아서 살펴보니 ajax 통신임에도 불구하고 json 타입이 아닌 Object 타입으로 받아오고 있었다.

java 컨트롤러 부분에 가서 mybatis 리턴값을 출력해보니 분명 제이슨 타입으로 {"key" : "value"} 값이 나오고 있었는데 자세히 보니 datetime 형식의 데이터가 {"key" : value} 형식으로 출력이 되고있었다. ""가 없어서 json 형식이 깨져 ajax에도 json 타입이 아닌 Object 타입으로 데이터가 전달된 것이다.

문제의 원인은 내 mybatis 쿼리문이었다.
해당 쿼리문의 옵션을 resultType="java.util.HashMap"으로 주었기 때문에
쿼리문의 time 컬럼의 값이 결과 해시맵에 들어갈 때 string타입이 아닌 Date 타입으로 들어가진 것이다.

이를 해결하기 위해 쿼리에 date_format 함수를 사용하여 Date 타입을 String 타입으로 바꿔주었다.

<select id="selectDetecteLedgr" resultType="java.util.HashMap" parameterType="java.util.HashMap">
		SELECT 	
				DATE_FORMAT(TIME, '%Y-%m-%d %T') AS TIME,
				
		FROM 	
		WHERE	TIME = #{TIME}
</select>

해쉬맵으로 반환된다는 것을 염두에 두었어야 했는데 초보자 답게 신경쓰지 못하고 시간을 많이 버렸다.
심지어 컨트롤러 부분에서 출력했을 때 ""가 없다는 것을 발견하기 너무 힘들었다;;;

0개의 댓글