본문 바로가기

Programming/iBatis

iBatis - Iterate

Iterate - collection을 반복하거나 리스트내 각각을 위해 몸체부분을 반복


Iterate Attributes

prepend – the statement에 붙을 오버라이딩 가능한 SQL부분 (옵션)

property – 반복되기 위한 java.util.List타입의 프라퍼티 (필수?)

open – 반복의 전체를 열기 위한 문자열, 괄호를 위해 유용하다. (옵션)

close – 반복의 전체를 닫기 위한 문자열, 괄호를 위해 유용하다. (옵션)

conjunction – 각각의 반복 사이에 적용되기 위한 문자열, AND 그리고 OR을 위해 유용하다. (옵션)


<iterate> java.util.List 타입의 프라퍼티 반복

사용법 예제:

<iterate prepend=”AND” property=”userNameList” open=”(” close=”)” conjunction=”OR”>

username=#userNameList[]#

</iterate>


위와 같이 사용되었을 경우 아래와 같은 쿼리로 이해할 수 있다.


AND username = (#userNameList1# OR #userNameList2# OR #userNameList3# .....)


주의: iterator요소를 사용할 때 리스트 프라퍼티의 끝에 중괄호[] 를 포함하는 것은 중요하다. 중괄호는 문자열처럼 리스트를 간단하게 출력함으로부터 파서를 유지하기 위해 리스트처럼 객체를 구별한다.



참고: iBatis List parameter로 iterate 구성 시 java.lang.StringIndexOutOfBoundsException이 발생

참고 예제 : 

<Java>

List<String>  someList = new ArrayList<String>(3);

someList.add("1");

someList.add("2");

someList.add("3");

List resultSomethingList = sqlMapClient.queryForList("someTest", someList);


<XML query>

<select id = "selectSomething" parameterClass="list" resuleClass="String">

<iterate prepend=”AND” property="someList" open=”(” close=”)” conjunction=”,”>

#someList[]#

</iterate>

</select>


Error getting ordinal list from JavaBean. Cause java.lang.StringIndexOutOfBoundsException


해결 방안 : 

1. queryForList 등의 메소드를 호출하기 전, 파라미터로 전달할 list 객체를 Map객체로 감싼 후 전달

<Java>

List<String>  someList = new ArrayList<String>(3);

someList.add("1");

someList.add("2");

someList.add("3");


HashMap someListMap = new HashMap();

someListMap.put("someList",  someList);


List resultSomethingList = sqlMapClient.queryForList("someTest", someList);


<XML query>

<select id = "selectSomething" parameterClass="HashMap" resuleClass="HashMap">

<iterate prepend=”AND” property="someList" open=”(” close=”)” conjunction=”,”>

#someList[]#

</iterate>

</select>


2. iterate태그에서 property속성을 제거 - List를 파라미터로 전달할 경우 iterate태그에 property를 설정하면 전달된 list에서 해당 property를 찾으려고 시도하여 에러가 발생하는 것으로 보인다. 

<XML query>

<select id = "selectSomething" parameterClass="list" resuleClass="list">

<iterate prepend=”AND” open=”(” close=”)” conjunction=”,”>

#someList[]#

</iterate>

</select>



참고적으로 Map타입으로 사용할 경우 아래와 같이도 사용이 가능하다고 한다.
<JAVA>
HashMap map = new HashMap();
List list = new ArrayList();
HashMap subMap = new HashMap();
subMap.put("A", "1");

list.add(subMap);
map.put("someList", list);

<XML query>

<select id = "selectSomething" parameterClass="HashMap" resuleClass="HashMap">

<iterate prepend=”AND” property="someList" open=”(” close=”)” conjunction=”,”>

#someList[].A#

</iterate>

</select>



참조 : 

'Programming > iBatis' 카테고리의 다른 글

ClassMap을 이용한 복합(Complex) Properties  (0) 2012.12.27
iBatis - selectKey (자동생성키)  (0) 2012.12.27
QueryForList와 QueryForMap의 차이 예  (0) 2012.04.09
QueryForObject, List, Map  (0) 2012.04.09
iBatis - 동적쿼리  (0) 2012.04.06