Mybatis foreach not found에러
가끔 Mybatis에서
다중 insert 할 때 아래와 같은 에러를 낼 때가 있다.
<insert id="insertBookFileInfo" parameterType="java.util.List">
/* insertBookFileInfo */
INSERT INTO
book_file (
file_seq,
file_name,
)
VALUES
<foreach item="item" index="index" collection="list" separator=",">
(
#{item.fileSeq}
,#{item.orignlFileNm}
)
</foreach>
</insert>
Parameter '__frch__item_0.컬럼이름' not found
이것은 쿼리를 DB에 보내기 전, 파라미터를 변수 안에 세팅할 때, 바인딩이 안되어서 발생한 에러인데, 여러가지 원인이 있을 수 있겠다.
마이바티스 버전이 다르다던가...
등등..
나의 경우에는 예상이긴 하나,
<foreach><foreach>문을 세팅하는 시기와,
#{} 에 변수를 바인딩하는 시점,
${} 에 변수를 바인딩하는 시점 차이로 인해서 발생한 문제같다.
아래와 같은 시도를 한번 해보길 바란다.
<insert id="insertBookFileInfo" parameterType="java.util.List">
/* insertBookFileInfo */
INSERT INTO
book_file (
file_seq,
file_name,
)
VALUES
<foreach item="item" index="index" collection="list" separator=",">
(
${item.fileSeq}
,'${item.orignlFileNm}'
)
</foreach>
#{item.orignlFileNm} => '${item.orignlFileNm}'
이렇게 변경해보는 것이다.
Integer 타입을 사용하는 컬럼은 ${item.orignlFileNm} 으로 두고
VARCHAR를 사용하는 컬럼은 '${item.orignlFileNm}' 와 같은 방식으로 사용한다.
#는 쿼리가 실행 될 때 바인딩 해주고
$는 쿼리가 실행 되기 전에 바인딩을 해준다고 하는데
foreach는 쿼리가 실행 되기 이전에 바인딩 되는 부분이기 때문에
값을 세팅할 때도 마찬가지로 쿼리 실행 이전에
바인딩을 해주어야 하는 것 같다.