Java/mybatis

Mybatis REGEXP_LIKE 사용시 에러

바리새인 2025. 1. 15. 22:23

Mapper.xml

<otherwise>
    AND ${condition.data} ${condition.compare}
        CASE
            WHEN NOT REGEXP_LIKE(#{condition.value}, '^\d+(\.\d+)?$') THEN #{condition.value}
            ELSE TO_CHAR(TO_NUMBER(#{condition.value}))
        END
</otherwise>

에러

java.sql.SQLSyntaxErrorException: ORA-00932: 일관성 없는 데이터 유형: CHAR이(가) 필요하지만 NUMBER임

쿼리 결과

 AND DATA1 =
	CASE
		WHEN NOT REGEXP_LIKE('EX', '^\d+(\.\d+)'EX'$') THEN 'EX'
		ELSE  TO_NUMBER(1)
	END

조치: 쿼리로 안되서 앞에서 데이터 타입 조절함

Java

public boolean isNumeric(String str) {
    return str != null && str.matches("\\d+(\\.\\d+)?");
}

boolean isNumeric = isNumeric(condition.getValue());
condition.put("isNumeric", isNumeric);

Mapper.xml

<choose>
    <when test="!condition.isNumeric">
        AND ${condition.data} ${condition.compare} #{condition.value}
    </when>
    <otherwise>
        AND ${condition.data} ${condition.compare} TO_NUMBER(#{condition.value})
    </otherwise>
</choose>