본문 바로가기
iBatis

iBatis 쿼리로 vo와 맵핑한 값이 뷰단에서 null로 출력되는 경우

by BeGeek 2015. 2. 18.

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">
  <![CDATA[
   select *
   from people
  ]]>
 </select>

 

</sqlMap>

...

인데 정작 PeopleVO.java에는 아래와 같이 변수명이 지정되어 있는데

...

 private String pid;
 private String fname;
 private String lname;
 private String email;
 private String phone;
 private String salary;
 private String hiredate;

... 

DB의 people테이블 컬럼은 위 변수명과 다르게 지정되어 있기때문! (변수명과 컬럼명이 일치하는 salary값만 정상적으로 출력됨)

 

문제 해결하기 >

1) 쿼리의 각 컬럼명에 PeopleVO변수명과 같게 Alias 설정하기

 <sqlMap namespace ="people">

 <typeAlias alias="peopleVO" type="vo.PeopleVO"/>

 <select id="getAllPeopleList" resultClass="peopleVO">
  <![CDATA[
   select employee_id as pid,first_name as fname, last_name as lname, email,phone_number as phone,salary, hire_date as hiredate
   from people
  ]]>
 </select>

</sqlMap>

2) 쿼리 xml에서 각 컬럼에 맞게 resultMap을 설정하기 (추천)

 <sqlMap namespace="people">

 <typeAlias alias="peopleVO" type="vo.PeopleVO" />
 
 <resultMap id="peopleAllList" class="peopleVO">
   <result property="pid" column="employee_id"/>
   <result property="fname" column="first_name" />
   <result property="lname" column="last_name" />
   <result property="email" column="email" />
   <result property="phone" column="phone_number" />
   <result property="hiredate" column="hire_date" />
   <result property="salary" column="salary" />
 </resultMap>

 <select id="getAllPeopleList" resultMap="peopleAllList">
  <![CDATA[
   select *
   from people
  ]]>
 </select>

</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개의 방법대로 처리하면 정상적으로 출력됨!

 

댓글