왜 mybatis를 안쓰는지 참 이해가 간다.
디버깅이 어려우며, 컴파일 당시에 에러를 잡지 못한다. 그리고 쿼리 돌릴때 예외가 참 많다.
이번에 닥친 오류는
invalid comparison: java.util.Arrays$ArrayList and java.lang.String
XML 리스트 비교연산자 오류
리스트 형태의 파라미터를 !=, == 연산자로 리스트의 공백여부를 비교하려고 했기 때문이다.
다른 글들에서는 파라미터명.size() != 0 으로 하라고 하는데
파라미터명.isEmpty()도 가능하다.
참고로 .equals('') => 이것도 오류는 안나지만, 옳은 비교가 아니다(의미없는 비교). 이유는 리스트 객체와 '' 값을 비교하기 때문. 늘 false를 반환한다.
<select id="selectItems" parameterType="java.util.List">
SELECT * FROM items
WHERE item_id NOT IN
<if idList != null and !idList.isEmpty()>
<foreach collection="idList" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</select>
<!--혹은 -->
<select id="selectItems" parameterType="java.util.List">
SELECT * FROM items
WHERE item_id NOT IN
<if idList != null and idList.size != 0>
<foreach collection="idList" item="id" index="index" open="(" separator="," close=")">
#{id}
</foreach>
</if>
</select>
SQL에서는 != 연산자가 단일 값과의 비교에 사용되며, 리스트와 같은 컬렉션 형태와 비교할 수 없습니다. 따라서, MyBatis에서 리스트 형태의 파라미터를 사용하여 != 조건을 작성하려고 하면 SQL 문법 오류가 발생합니다.