ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • [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)에 사용할 때가 다르니 유념해야 한다.

     


     

    댓글

Designed by Tistory.