반응형
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 |