가끔 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는 쿼리가 실행 되기 이전에 바인딩 되는 부분이기 때문에

값을 세팅할 때도 마찬가지로 쿼리 실행 이전에

바인딩을 해주어야 하는 것 같다.