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>
<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 |