Post

Mybatis if 문에서 Integer 공백 체크

1. 이슈 사항

MyBatis의 다이나믹쿼리 if 문에서 공백 체크를 할 때 숫자 ‘0’이 체크가 안 되는 경우가 있다.

1
2
3
4
5
6
SELECT * FROM dual
<where>
    <if test="num != null and num != ''">
        AND NUM = #{num}
    </if>
</where>

num 변수의 데이터형이 Integer일 때, num 값이 0이라면 num != ''로 인식해서 원하는 조건 검색이 실행되지 않는다.

2. 해결 방법

1) String Type 사용

num을 String Type으로 전송 받는다.

2) equals 사용

num != ''대신 num.equals('')를 사용한다.

3) 커스텀 함수 사용

  • StringUtils.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
public class StringUtils {
    public static boolean isEmpty(Object obj) {
        if (obj == null) {
            return true;
        }

        if ((obj instanceof String) && (((String) obj).trim().length() == 0)) {
            return true;
        }

        if (obj instanceof Map) {
            return ((Map<?, ?>) obj).isEmpty();
        }

        if (obj instanceof List) {
            return ((List<?>) obj).isEmpty();
        }

        if (obj instanceof Object[]) {
            return (((Object[]) obj).length == 0);
        }

        return false;
    }
}
  • Mapper.xml
1
2
3
4
5
6
SELECT * FROM dual
<where>
    <if test="@org.apache.commons.lang3.StringUtils@isNotEmpty(num)">
        AND NUM = #{num}
    </if>
</where>

[출처 및 참고]

This post is licensed under CC BY 4.0 by the author.