본문 바로가기
Framework/Mybatis

Mybatis IF문 1글자 비교에러( NumberformatException )

by 나비와꽃기린 2019. 1. 7.
336x280(권장), 300x250(권장), 250x250, 200x200 크기의 광고 코드만 넣을 수 있습니다.





DOC_NUM (게시글번호) 컬럼값을

넘어오는 파라미터 statusFlag라는 값에 따라 #{docnum}이라는 파라미터로 insert할지

SEQ insert할지를 구현하고 싶었다.


--> Update모드일때는 docnum을 update

--> Update가 아닐때 모드에는 docnum을 신규번호로insert







<기존>



satusFlag를 U라는 1글자 단어로 지정하고




위와 같이 동적쿼리를 작성했다.

나 같은 경우는 choose , when 구문에서 equals로 'U'자 비교했는데



‘U’ 파라미터를 던질 때 계속 otherwise로 빠지는 문제가 있었다. 아놔!!!!

mybatis에서 문자 1글자에 대한 equals 문을 제대로 인식하지 못하는 문제라고 생각.

파라미터를 문자 1글자가 아니라 단어로 변경했다.






<변경후>




U -> Update 로 변경

고치고 실행하니 잘되더이다.......








그렇다면 왜?????????????? 

 


<if test=”statusFlag == ‘U’”>

<if test=” ‘U’.equals(statusFlag) ”>


경우 한 글자로 다이나믹쿼리에서 비교를 하게 되면

java.lang.NumberFormatException :For input string 이라는 에러가 발생하거나

또는 비교자체가 되지 않을 수 있다고 한다 ( 파라미터 인식 X )

 

다만, mybatis의 문제는 아니고

OGNL(Object Graph Navigation Language) 문제라고

OGNL 에서는 U 문자를 char 형으로 인식하고 Update 문자를 String 으로 인식하기 때문에

<if test=”statusFlag == ‘U’”>

<if test=” ‘U’.equals(statusFlag) ”>

 

와 같은 case일경우 NumberFormat으로 비교를 시도해서 Exception이 나게 된다..







그렇다면 해결방법은 뭘까????



1.     쌍따옴표와 홑따옴표 위치 변경

<if test=’statusFlag == “U”’>

 

2.     쌍따옴표를 HTML 코드로 변경

<if test=”statusFlag == &quot;U&quot;”>

 

3.     toString()함수를 통해 char -> string으로 변환

<if test=”statusFlag == ‘U’.toString()”>

 

4.     파라미터 변경

<if test=”statusFlag == ‘Update’”>


5.     equals 를 재정의해서 사용하는 방법도 있다고