반응형
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를 사용할 필요는 없을 듯 합니다.
반응형
'Programming > JPA ⁄ Spring' 카테고리의 다른 글
MAXIMUM SESSIONS OF 1 FOR THIS PRINCIPAL EXCEEDED 해결하기 (2) | 2021.06.10 |
---|---|
Eclipse에서 Tomcat 프로젝트 Context Path 변경하기. (0) | 2021.06.06 |
서블릿에서 한글 쿠키 사용하기. An invalid character [32] was present in the Cookie value 해결하기. (1) | 2021.06.04 |
org.apache.ibatis.reflection.ReflectionException:There is no getter for property named 해결하기 (0) | 2021.06.03 |
특정 문자 변경하는 Filter 만들기 (0) | 2021.06.02 |