Programming/JPA ⁄Spring

MyBatis update 조건에 따른 동적 쿼리 작성하기 , Unable to convert type java.lang.Integer of 12 to type of java.lang.CharSequence 해결 방법

📝 작성 : 2021.06.05  ⏱ 수정 : 
반응형

MyBatis update 조건에 따른 동적 쿼리 작성하기  및

Unable to convert type java.lang.Integer of 12 to type of java.lang.CharSequence  오류 해결 방법


 

	<update id="updateCard" parameterType="best.gaia.vo.KanbanCardVO">
		UPDATE KANBAN_CARD		
        UPDATE KANBAN_CARD
		SET
		    KB_CARD_PRIV_NO = #{kb_card_priv_no,jdbcType=NUMERIC}
		    ,MEM_NO = #{mem_no,jdbcType=NUMERIC}
		    ,KB_COL_NO = #{kb_col_no,jdbcType=NUMERIC}
		    ,ISSUE_SID = #{issue_sid,jdbcType=NUMERIC}
		    ,KB_CARD_CONT = #{kb_card_cont,jdbcType=VARCHAR}
		    ,KB_CARD_WRITE_DATE = TO_DATE(#{kb_card_write_date,jdbcType=VARCHAR},'yyyy-mm-dd hh24-mi-ss')
               		WHERE
	        KB_CARD_NO = #{kb_card_no}
	</update>

위의 쿼리가 있습니다.

모든 컬럼값을 업데이트를 할 때만 사용할 수 있고, 특정 값만 수정 하고자 할 때는 사용 할 수 없는데요,

그렇다고 update 하는 메서드를 하나하나 따로 만들 수도 없습니다.

그럴때는 동적 쿼리를 사용하면 쉽습니다.

	<update id="updateCard" parameterType="best.gaia.vo.KanbanCardVO">
		UPDATE KANBAN_CARD
		<set>
			<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(kb_card_priv_no)">
			    KB_CARD_PRIV_NO = #{kb_card_priv_no,jdbcType=NUMERIC},
			</if>
			<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(kb_col_no)">
			    KB_COL_NO = #{kb_col_no,jdbcType=NUMERIC},
			</if>
			<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(kb_card_cont)">
			    KB_CARD_CONT = #{kb_card_cont,jdbcType=VARCHAR},
			</if>
		</set>
   		WHERE
	        KB_CARD_NO = #{kb_card_no}
	</update>

 

일단 쿼리를 위와 같이 바꿨는데요,  여기서 set 엘리먼트는 동적으로 SET 키워드를 붙히고 필요없는 콤마를 제거 합니다.

trim 엘리먼트를 사용하면 다음과 같습니다.

<trim prefix="SET" suffixOverrides=",">
  ...
</trim>

 

위의 StringUtils를 사용 하려면  commons의 lang3 를 등록 해 주어야 합니다.

  	<!-- https://mvnrepository.com/artifact/org.apache.commons/commons-lang3 -->
	<dependency>
	    <groupId>org.apache.commons</groupId>
	    <artifactId>commons-lang3</artifactId>
	    <version>3.12.0</version>
	</dependency>

 

xml을 수정 한 후 코드를 돌려봤는데,

Unable to convert type java.lang.Integer of 12 to type of java.lang.CharSequence 라며 에러가 발생합니다.

 

StringUtils를 사용 하는데 Integer 값이 들어가서 그런 것 같습니다.

 

lang3를 뒤져 보니 NumberUtils 라는게 있네요.

isNumeric가 있긴 한데 여전히 String을 인자로 받네요

그래서 ObjectUtils 의 isNotEmpty 를 써보았습니다.

	<update id="updateCard" parameterType="best.gaia.vo.KanbanCardVO">
		UPDATE KANBAN_CARD
		<set>
			<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(kb_card_priv_no)">
			    KB_CARD_PRIV_NO = #{kb_card_priv_no,jdbcType=NUMERIC},
			</if>
			<if test="@org.apache.commons.lang3.ObjectUtils@isNotEmpty(kb_col_no)">
			    KB_COL_NO = #{kb_col_no,jdbcType=NUMERIC},
			</if>
			<if test="@org.apache.commons.lang3.StringUtils@isNotBlank(kb_card_cont)">
			    KB_CARD_CONT = #{kb_card_cont,jdbcType=VARCHAR},
			</if>
		</set>
   		WHERE
	        KB_CARD_NO = #{kb_card_no}
	</update>

이제 에러 없이 잘 동작 하는 것을 확인 할 수 있습니다!! 하지만 단순히 null 여부만 확인한다면 ObjectUtils를 사용할 필요는 없을 듯 합니다.

반응형