-
[iBatis] UPDATE 쿼리에 dynamic 쿼리 적용 시 SET 절Error 2021. 4. 28. 10:56
에러 내용
java.lang.Exception: SqlMapClient operation; bad SQL grammar []; nested exception is com.ibatis.common.jdbc.exception.NestedSQLException: --- The error occurred while applying a parameter map. --- Check the updateSrvAccount-InlineParameterMap. --- Check the statement (update failed). --- Cause: java.sql.SQLException: Syntax error or access violation message from server: "You have an error in your SQL syntax; check the manual that corresponds to your MariaDB server version for the right syntax to use near 'exceptionyn = 'N' WHERE server_ip = '192.168.0.1' AND accoun...' at line 1"
bad SQL grammer은 보통 SQL문에 에러가 있을 경우 발생하는 에러다.
철자를 확인하거나 각 변수 / 컬럼명을 확인하고 틀린 부분을 수정하면 되는 문제
그런데 문제의 쿼리의 경우, 내가 짠 쿼리가 아니고 다른 사람이 짠 쿼리였다. 문제가 없다는 건데...?
실제 쿼리에는 문제가 없었다.
문제의 쿼리 (수정 전)
<update id="updateSrvAccount"> UPDATE SERVER_ACCOUNT SET ip = #ip#, account = #account#, password = #password#, <dynamic> <isNotEmpty prepend="AND" property="exceptionyn"> ,exceptionyn = #exceptionyn# </isNotEmpty> </dynamic> WHERE ip = #ip# AND account = #account# </update>
문제의 쿼리. 얼핏 봐서는 오류가 없어 보인다. 그런데 이는 <dynamic> 태그의 문제였다.
보통 동적 쿼리인 <dynamic> 태그는 Where 절에 많이 쓰인다. input 받은 값을 파라미터로 대입하는데, 이 값이 입력 값에 따라 다르기 때문.
그러나 Where 절에 사용할 때와 update의 set 절에 dynamic 태그를 쓸 때는 조금 다른 주의사항이 이싿.
<isNotEmpty prepend="AND" property="exceptionyn"></isNotEmpty>
문제의 부분은 여기. Where 절의 경우 여러 조건절이 있을 경우 'AND'를 사용해 잇는다.
그러나 Update 의 Set 의 경우 ','로 잇는다. 위의 쿼리에서는 컬럼인 exceptionyn 앞에 ','를 붙였는데,
dynamic 태그를 사용할 경우 ','을 쿼리에 직접 쓰는게 아닌 prepend 속성에 ','를 지정해야 한다.
수정 후
<update id="updateSrvAccount"> UPDATE SERVER_ACCOUNT SET ip = #ip#, account = #account#, password = #password#, <dynamic> <isNotEmpty prepend="," property="exceptionyn"> exceptionyn = #exceptionyn# </isNotEmpty> </dynamic> WHERE ip = #ip# AND account = #account# </update>
수정한 쿼리. prepend 속성에 ','를 부여하고 쿼리에 직접 쓴 ','를 지웠다.
ibatis와 myBatis는 비슷하지만 부분 부분 사용례가 다르다.
또 ibatis의 경우, Where 절의 dynamic 쿼리를 사용할 때와 Update(set)에 사용할 때가 다르니 유념해야 한다.
'Error' 카테고리의 다른 글