iBatis 쿼리로 vo와 맵핑한 값이 뷰단에서 null로 출력되는 경우가 있다.
원인은 쿼리 xml에 resultClass로 VO클래스를 지정했는데 Oracle DB의 컬럼값과 VO클래스의 변수명이 일치하지 않아서 생긴 문제 임!
sql-people.xml
... <sqlMap namespace ="people"> <typeAlias alias="peopleVO" type="vo.PeopleVO"/> <select id="getAllPeopleList" resultClass="peopleVO">
</sqlMap> ... |
인데 정작 PeopleVO.java에는 아래와 같이 변수명이 지정되어 있는데
... private String pid; ... |
DB의 people테이블 컬럼은 위 변수명과 다르게 지정되어 있기때문! (변수명과 컬럼명이 일치하는 salary값만 정상적으로 출력됨)
문제 해결하기 >
1) 쿼리의 각 컬럼명에 PeopleVO변수명과 같게 Alias 설정하기
<sqlMap namespace ="people"> <typeAlias alias="peopleVO" type="vo.PeopleVO"/> <select id="getAllPeopleList" resultClass="peopleVO"> </sqlMap> |
2) 쿼리 xml에서 각 컬럼에 맞게 resultMap을 설정하기 (추천)
<sqlMap namespace="people"> <typeAlias alias="peopleVO" type="vo.PeopleVO" /> <select id="getAllPeopleList" resultMap="peopleAllList"> </sqlMap> |
result엘레멘트의 property속성에 PeopleVO의 각 변수명의 이름을 넣고 column 에는 DB의 각 컬럼명을 넣어서 설정.
* property값이 잘못 기재 될 경우 com.ibatis.common.beans.ProbeException: There is no WRITEABLE property named 'salary1' in class 'vo.PeopleVO' 에러 발생 함 !
* column값이 잘못 기재 될 경우 "부적합한 열이름" 에러 발생함!
3) PeopleVO.java의 변수명을 각 컬럼명과 일치하게 바꾸기
(단, 이경우 변수명에 맞게 getter/setter메소드도 바꿔줘야하니 번거로움. 왠만하면 추천하지 않음;;;;)
위 1~3개의 방법대로 처리하면 정상적으로 출력됨!
댓글