2016. 1. 5. 17:00ㆍframework/MyBatis
ex 1) <if test="stringValue == 'Y'"> ex 2) <if test="condition.equals('Y')"> </if> 지금처럼 한 글자를 다이나믹쿼리 IF 안에서 비교할 때 java.lang.NumberFormatException: For input string: "Y" 에러 또는 비교가 되지 않을 수 있다. (인식 불가 혹은 오작동 가능성도 있음) OGNL(Object Graph Navigation Language) 의 문제이다. OGNL 인터프리터에서는 위 구문의 'Y' 를 char 형으로 인식하고, 'YY' 나 "Y" 는 String으로 인식한다. (따옴표를 잘보자) 그래서 <if test="stringValue == 'Y'"> 이와 같은 구문을 비교할 때 NumberFormat으로 비교를 시도하여 Exception이 발생한다. 이유는 java의 char형은 실제로 문자의 코드값을 저장하기 때문이다. 그래서 아래와 같은 형변환이 가능하다 char y = 'Y'; 그래서 위와 같은 상황을 피하기 위해서는 다음과 같은 해결책이 존재한다. 1. <if test='stringValue == "Y"'> – 쌍따옴표와 홑따옴표의 위치를 변경 2. <if test="stringValue == "Y""> – 쌍따옴표를 HTML 코드로 변경 3. <if test="stringValue == 'Y'.toString()"> – toString() 함수를 사용해 String 형으로 변환 4. 함수 생성 (equals 함수를 새로 생성하고 가져다 쓰는 방법 ) 함수를 생성해서 사용방법을 참조하여 equals함수를 재정의 ps. 1번 방법 사용시 == 대신에 equals 함수를 추천한다. 따옴표에 구애받지 안으려면 4번방법을 추천한다.
</if>
결론적으로 위 현상은 myBatis 문제는 아니고
http://cofs.tistory.com/97 에서 설명하고 있는
'framework > MyBatis' 카테고리의 다른 글
| Mybatis DAO에서 쿼리 추출 및 로그 찍기 (Log 라이브러리 사용안함) (0) | 2018.07.31 |
|---|---|
| MyBatis isNull isEmpty 사용하기 (0) | 2017.06.28 |
| MyBatis resultType이 Map일경우 key를 소문자로 만들기 (2) | 2017.06.28 |
| ORACLE | query 로 VO 및 mybatis, ibatis에서 사용할 컬럼, resultMap 자동생성하기 (0) | 2017.01.03 |
| Mybatis > RowBounds 의 고찰 (8) | 2016.08.09 |
| 다이나믹 쿼리 / if / 공백체크 / 숫자 0 / 이슈 | MyBatis (2) | 2016.01.05 |