동적쿼리를 생성해야 하는 경우는 상당히 많다.


이번에 ibatis를 처음 사용하면서 편하긴 하지만 알아야 할것도 참 많다고 생각이 드는데


아무튼 ibatis에서 리스트를 받아와 쿼리문에 foreach문 같은 반복문을 생성하도록 하려면


iterate를 사용해야 한다.


사용법은


<iterate property="measureTypeList" open="(" close=")" conjunction="or">

<![CDATA[ TYPE_ID =#measureTypeList[]#]]>

</iterate>


이런식으로 사용이 가능 하다.


property는 받아오는 리스트의 이름


open는 반복문이 시작할때 들어가는 텍스트


close는 그 반대


즉 저렇게 돌리면


(TYPE_ID  =#measureTypeList[]# or TYPE_ID  =#measureTypeList[]# or TYPE_ID  =#measureTypeList[]#)



이런식으로 돌아간다 conjunction은 반복할때마다 들어갈 텍스트이다



그런데 저렇게 사용을 할때 


outOfBoundsException 에러가 나는 경우가 있다!!!


컨트롤러에서 보내는 parameterClass를 리스트로 만들어서 보냈는데! 왜!!! 왜 안돼는걸까!



ArrayList<String> measureTypeList = new ArrayList<String>();

measureTypeList.add("MEASURE_TYP_117");

measureTypeList.add("MEASURE_TYP_118");


컨트롤러에서 저런식으로 만들어서 바로 파라메터로 보내버렸을때 발생하는 에러 이다



위의 에러를 해결하기 위해서는


만들어 놓은 리스트를 hash맵에 담아서 보내야 한다


HashMap measureTypeListMap = new HashMap();

measureTypeListMap.put("measureTypeList", measureTypeList);



이런식으로 해쉬맵에 담아서 보내면 에러가 해결이 된다.



<select id="WidgetTagDAO.measureTypeList" parameterClass="HashMap" resultMap="widgetTag">

<![CDATA[

SELECT*

   

 FROM

 where

]]>

<iterate property="measureTypeList" open="(" close=")" conjunction="or">

<![CDATA[ TYPE_ID   =#measureTypeList[]#]]>

</iterate>

</select>

XML에서 작성하면 위와 같이 작성을 하면 된다.




+ Recent posts