'sun.reflect.GeneratedMethodAccessor1540.invoke(null:-1)'에 해당되는 글 1건

  1. 2012.09.13 [iBatis] iterate 사용법 1
54.iBATIS, MyBatis2012. 9. 13. 03:31
반응형

출처 : http://lonelycat.tistory.com/289 

 

<statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
SELECT
COUNT(*) TOTAL_COUNT
FROM
SUB_CONTENT_TYPE
<iterate prepend="WHERE" property="deleteContentTypeList" open="(" conjunction="," close=")">
CONTENT_TYPE IN #deleteContentTypeList[]#
</iterate>
</statement>

<statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
SELECT
COUNT(*) TOTAL_COUNT
FROM
SUB_CONTENT_TYPE
<iterate prepend="WHERE CONTENT_TYPE IN " property="deleteContentTypeList" open="(" conjunction="," close=")">
#deleteContentTypeList[]#
</iterate>
</statement>


<statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" parameterClass="java.util.List" resultClass="java.lang.String">
SELECT
COUNT(*) TOTAL_COUNT
FROM
SUB_CONTENT_TYPE
<dynamic prepend="WHERE">
<iterate property="deleteContentTypeList" open="(" conjunction="," close=")">
CONTENT_TYPE IN #deleteContentTypeList[]#
</iterate>
</dynamic>
</statement>


버근지 뭔지 몰라도 위의 방식은 하나도 안된다. property속성을 쓰면 안되는건지...
근데 되는 사람들도 있는 것 같고..

<statement id="CHECK_SUB_CONTENT_TYPE_FOR_DELETE" resultClass="java.lang.String">
SELECT
COUNT(*) TOTAL_COUNT
FROM
SUB_CONTENT_TYPE
<dynamic prepend="WHERE">
<iterate open="CONTENT_TYPE IN (" close=")" conjunction="," >
#[]#
</iterate>
</dynamic>
</statement>


이것처럼 아예 property 속성을 없애고, list의 이름을 없이 하면 잘됨.

참고:http://lostsin.tistory.com/tag/iBATIS

sql의 xml설정은 다음과 같이 하고

<delete id="deletes" >
DELETE FROM users
<dynamic prepend="WHERE id IN">
<iterate open="(" conjunction="," close=")">
#[]#
</iterate>
</dynamic>
</delete>


DAO는 다음과 같이 한다
public int delete(Integer[] ids) {
return getSqlMapClientTemplate().delete("users.deletes", ids);
}

해당 쿼리는 <iterate> 구문에 의하여 WHERE id IN (1,2,3,4,5) 방식으로
값이 매핑되게 된다.


보너스1.
List<>를 사용하는 방법도 xml 쿼리 부분은 동일하다.

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

list.add("1");

list.add("2");

list.add("3");

List objs = sqlMapClient.queryForList("select-test",list);




보너스2.
parameterClass="map" 을 사용할 땐

     WHERE

session_id IN

<iterate property="sessionIds" open="(" close=")" conjunction=",">

#key[]#

</iterate>

hash의 key 값으로 사용된 string을 지정해주면 된다 (?)


추가.

HashMap map = new HashMap();
map.put("deleteContentTypeList", deleteContentTypeList);
map.put("updateId", updateId);
map.put("updateTime", updateTime);

this.update("contenttype.DELETE_CONTENT_TYPE", map);


<statement id="DELETE_CONTENT_TYPE">
UPDATE
CONTENT_TYPE
SET
STATUS = 'D'
, UPDATE_ID = #updateId#
, UPDATE_TIME = #updateTime#
<dynamic prepend="WHERE">
<iterate property="deleteContentTypeList" open="CONTENT_TYPE IN (" close=")" conjunction=",">
#deleteContentTypeList[]#
</iterate>
</dynamic>
</statement>


이건 또 된다. map에 넣어서 넘겨주면 멀쩡히 잘 되는군...

# 추가
list 를 패러미터로 전달 시 iterate 태그에서 property 를 설정하면(map으로 넘겼을 떄 말고),
전달된 list 에서 해당 property 를 찾으려고 시도하는 것 같다.
<iterate> 태그에서 property 속성을 제거하면 정상적으로 작동한다.

<select id="selectSomething" parameterClass="list">
// select something and use iterate
<iterate> // iterate 태그 내 property 속성을 제거하라
#someList[]#
</iterate>
</select>

Posted by 1010