Search Results for '개발노트/iBatis/myBatis'

21 POSTS

  1. 2007.10.30 iBATIS-SQLMaps 2.0 Tutorial.pdf(한글번역판)
  2. 2007.10.30 dynamic iterate 기능에 대해서.. 1
  3. 2007.10.06 iBatis를 사용하면서 자주 발생하는 에러...중 하나
가끔씩 찾아보면서 학습하기에 좋다.
특히 오프라인인 경우에서...


dynamic iterate 기능에 대해서..

Posted 2007. 10. 30. 15:38

쿼리를 작성하다보면 조건절에 having이나 IN으로 넣어야 하는데...
이때 안에 들어가는 결과를 외부에서 가져다가 넣고자 할때 유용한것 같다.
예전엔 결과를 for문 돌리면서 "," 붙여가면서 String으로 넣었었는데...

Application으로 간단히 테스트 해보았다.
=============== Test.java==============
List<City>cityList  = sqlMap.queryForList("getCityList");
String [] arrayStr = new String[cityList.size()];

  for(int i = 0; i< cityList.size();i++) {
   City city = cityList.get(i);
   arrayStr[i] = city.getCountryCode();
  }

  City paramCity = new City();
  paramCity.setCountryTypes(arrayStr);

  List<City>cityListIterator  = sqlMap.queryForList("getCityListIterator", paramCity);

========sqlMap.xml==============
<select id="getCityListIteratorSuccess" resultMap="cityResult" parameterClass="City">
  SELECT ID, NAME, COUNTRYCODE, DISTRICT, POPULATION
  FROM CITY
  <dynamic prepend="WHERE COUNTRYCODE IN">
   <iterate property="countryTypes" open="(" close=")" conjunction=",">
    countryCode = #countryTypes[]#
   </iterate>
  </dynamic>
  ORDER BY NAME
 </select>
=================================
Result : OK 227Rows Returns...

Map으로 묶어서 넘길경우

Map<String, Object> paramMap = new HashMap<String, Object>();
  paramMap.put("arrStr", arrayStr);

<select id="getCityListIteratorSuccess2" resultMap="cityResult" parameterClass="map">
  SELECT ID, NAME, COUNTRYCODE, DISTRICT, POPULATION
  FROM CITY
  <dynamic prepend="WHERE COUNTRYCODE IN">
   <iterate property="arrStr" open="(" close=")" conjunction=",">
    countryCode = #arrStr[]#
   </iterate>
  </dynamic>
  ORDER BY NAME
 </select>
================================
역시 같은 결과....

클래스나 맵에 넣지 않고 넘기는 방법은? 실패... 이유는 모르겠다...



로그에 아래와 같은 에러메시지가 출력되고

2007-10-06 11:37:57,843 INFO [org.springframework.jdbc.support.SQLErrorCodesFactory] - <SQLErrorCodes loaded: [DB2, Derby, H2, HSQL, Informix, MS-SQL, MySQL, Oracle, PostgreSQL, Sybase]>
2007. 10. 6 오전 11:37:57 org.apache.catalina.core.StandardWrapperValve invoke
심각: Servlet.service() for servlet test_spring threw exception
java.lang.IllegalArgumentException
 at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
 at sun.reflect.NativeMethodAccessorImpl.invoke(Unknown Source)
 at sun.reflect.DelegatingMethodAccessorImpl.invoke(Unknown Source)
 at java.lang.reflect.Method.invoke(Unknown Source)
 at com.ibatis.sqlmap.engine.accessplan.PropertyAccessPlan.setProperties(PropertyAccessPlan.java:46)
 at com.ibatis.sqlmap.engine.exchange.JavaBeanDataExchange.setData(JavaBeanDataExchange.java:112)
 at com.ibatis.sqlmap.engine.mapping.result.BasicResultMap.setResultObjectValues(BasicResultMap.java:373)
 at com.ibatis.sqlmap.engine.mapping.statement.RowHandlerCallback.handleResultObject(RowHandlerCallback.java:64)
 at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleResults(SqlExecutor.java:382)
 at com.ibatis.sqlmap.engine.execution.SqlExecutor.handleMultipleResults(SqlExecutor.java:301)
 at com.ibatis.sqlmap.engine.execution.SqlExecutor.executeQuery(SqlExecutor.java:190)
....

화면엔...
Error setting property 'setXXX' of 어쩌구 저쩌구 나오는 경우...의 대부분은
일종의 NullPointerException이다.

<resultMap ... 하위의
<property 에 nullValue를 처리해주지 않은 곳에 null이 들어갈 경우 발생한다.

<resultMap class="test.Member" id="memberResult" >
  <result property="id" column="id" />
  <result property="name" column="name"/>
<result property="age" column="age" nullValue="0"/>

테이블 컬럼에 not null이 아닌 항목은 위와 같이 nullValue처리를 꼭 해주어야 한다는 사실..




« PREV : 1 : 2 : 3 : 4 : 5 : 6 : 7 : NEXT »