MyBatis를 이용하여 SQL문을 처리하고있는데, 디버깅하다가 알게 된 사실.
varchar컬럼은 String으로 알아서 맵핑되는데 char컬럼은 맵핑이 안되고 error가 발생하더라. (아님 null)
왜이러지? 하고 한참 찾아보았다.
그러다 아래 원글님의 resultMap을 사용하는 것을 참고하여 해결했다.
https://goodteacher.tistory.com/650
결과만 요약하면,
char컬럼이 있고, 이 컬럼을 String으로 받고싶으면, Mapper.xml에서 resultMap을 선언하고, 그 맵으로 결과를 받아오도록 해주면 된다.
먼저 컬럼이 아래와 같다고 가정하자.
컬럼명 | DB column형식 | Entity의 Type |
article_id | int | int |
writer_id | varchar(20) | String |
content | varchar(500) | String |
article_type | char(5) | String |
이렇게 테이블이 구성되었다고 가정한다. 그리고 entity는 아래처럼 선언
@Data
@NoArgsConstructor
public MyEntity{
int articleId;
String writerId;
String content;
String articleType;
}
Entity의 arcticleId, writerId, content는 데이터가 잘 들어가지만, articleType에는 null이 들어간다.
아마 char컬럼은 다른 형태로 받아오는것 같다. 이걸 맵핑을 지정하면 해결이 된다.
Mapper.xml에서 다음과 같이 resultMap을 선언하자.
<?xml version="1.0" encoding="UTF-8"?>
<!DOCTYPE mapper PUBLIC "-//mybatis.org//DTD Mapper 3.0//EN" "http://mybatis.org/dtd/mybatis-3-mapper.dtd">
<mapper namespace="myPackages.myData">
<select id="myMapperQuery" resultMap="myMap" >
...
</select>
<resultMap type="MyObjType" id="myMap">
<id column="article_id" property="articleId" />
<result column="writer_id" property="writerId" />
...
<result column="article_type" property="articleType" />
</resultMap>
</mapper>
이런식으로 resultMap을 만들고, 그걸 xml에서 resultMap으로 지정하면 된다. resultType이 아닌 resultMap임을 주의
반응형
댓글