[ERROR_LOG] MyBatis Dynamic(동적) SQL 에러, org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression



MyBatis Dynamic(동적) SQL 에러

org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression

스프링으로 코딩중 XML 매퍼에서 MyBatis Dynamic(동적) SQL 작성시 잘못된 구문이나, 오류가 있을 때 발생하였습니다.

<choose>
    <when test="status == 2 OR status == 4">
        ...
    </when>
    <otherwise>
        ...
    </otherwise>
</choose>

위와 같은 코드가 있다면, 실행시 아래와 같은 에러가 납니다.

org.springframework.web.util.NestedServletException: Request processing failed; 
nested exception is org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: 
Error evaluating expression 'status == 2 OR status == 4'. Cause: 
org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression: 
status == 2 OR status == 4 [org.apache.ibatis.ognl.ParseException: Encountered " <IDENT> "OR "" at line 1, column 13.
Was expecting one of:
    <EOF> 
    "," ...
    "=" ...
    "?" ...
    "||" ...
    "or" ...
    "&&" ...
    "and" ...
    "|" ...
    "bor" ...
    "^" ...
    "xor" ...
    "&" ...
    "band" ...
    "==" ...
    "eq" ...
    "!=" ...
    "neq" ...
    "<" ...
    "lt" ...
    ">" ...
    "gt" ...
    "<=" ...
    "lte" ...
    ">=" ...
    "gte" ...
    "in" ...
    "not" ...
    "<<" ...
    "shl" ...
    ">>" ...
    "shr" ...
    ">>>" ...
    "ushr" ...
    "+" ...
    "-" ...
    "*" ...
    "/" ...
    "%" ...
    "instanceof" ...
    "." ...
    "(" ...
    "[" ...
    <DYNAMIC_SUBSCRIPT> ...
    ]

동적 SQL을 사용할 때, OR 표기가 잘못되었기 때문에 에러가 발생했습니다.

OR 을 or 로 바꿔주면 해결됩니다. 그외 구문은 아래를 참고해주세요.

    "||" / "or" ...     // 또는

    "&&" / "and" ...    // 그리고

    "|" / "bor" ...     // 논리합

    "^" / "xor" ...     // 비트간의 XOR

    "&" /  "band" ...   // 논리곱



    "==" / "eq" ...     // 같다

    "!=" / "neq" ...    // 같지않다

    "<" / "lt" ...      // 작다

    ">" / "gt" ...      // 크다

    "<=" / "lte" ...    // 작거나 같다

    ">=" / "gte" ...    // 크거나 같다



    "in" ...            // 포함

    "not" ...           // 부정

    "<<" / "shl" ...    // 왼쪽 시프트

    ">>" / "shr" ...    // 오른쪽 시프트

    ">>>" / "ushr" ...  // 부호 없는 오른쪽 시프트

    "+" ...             // 더하기

    "-" ...             // 빼기

    "*" ...             // 곱하기

    "/" ...             // 나누기 

    "%" ...             // 몫