mybatis 동적쿼리 작성시 한글 문제
- 작성자 :
- 대****사
- 작성일 :
- 2019-11-06 09:18:50
- 조회수 :
- 17,461
- 구분 :
- 기타
- 진행상태 :
- 완료
Q
전자정부 프레임워크 3.8에 넥사크로 17을 사용 중입니다.
DB는 오라클 12C이고 테이블명과 컬럼명이 한글로 되어 있습니다.
UI툴 또는 내부 메소드들 간에 파라미터 전달 방식은 VO방식은 사용하지 않고
모두 Map 방식으로 파라미터를 전달하고 있습니다.
(DAO에서 SQL호출시에도 Map으로 파라미터 전달)
문제의 내용은 MyBatis 에서 동적 쿼리 테그를 사용할 경우에 다음과 같이 컬럼명을 한글로 처리하면
인코딩 에러가 생겨서 동적쿼리 방식을 사용할 수가 없습니다.
(셈플 SQL)
<!-- test 코드 조회 -->
<select id="testCodeSSelect2" parameterType="java.util.Map" resultType="java.util.Map">
SELECT 구분코드
, 상세코드
, 코드명
, 사용여부
FROM TB00_공통코드TMP
WHERE 1=1
<if test=' 구분코드 != null and 구분코드 != "" '> <======== 이부분에서 오류 발생
AND 구분코드 = #{구분코드} <======== 이부분에 값은 제대로 맵핑 됩니다.
</if>
</select>
(오류 메시지)
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression '구분코드 != null and 구분코드 != ""'. Cause: org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression: 구분코드 != null and 구분코드 != "" [org.apache.ibatis.ognl.TokenMgrError: Lexical error at line 1, column 1. Encountered: "\uad6c" (44396), after : ""]
=======================================================================
인터넷을 뒤져보니
1. 이클립스의 환경을 UTF-8로 맞춰라 (확인차원에서 다시 다 UTF-8로 맞춤)
2. datasource에서 jdbc:oracle:thin:@192.168.219.195:1521:DB명 뒤에다가
?useUnicode=true&characterEncoding=utf8 를 붙여라 (붙이면 DB 컨넥션시 오류 발생)
3. web.xml 에 필터 추가해라 (이미 추가되어 있음)
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
현재까지는 이 시도들은 모두 해 본 상태입니다.
혹시 Mybatis에서는 동적쿼리 테그에서 한글을 사용 못하는건가요? 아니면 방법이 있다면
뭐를 더 확인해 봐야 할까요?
아니면 ibatis로 하면 동적쿼리 테그 사용시 한글문제를 해결할수 있을까요?
DB는 오라클 12C이고 테이블명과 컬럼명이 한글로 되어 있습니다.
UI툴 또는 내부 메소드들 간에 파라미터 전달 방식은 VO방식은 사용하지 않고
모두 Map 방식으로 파라미터를 전달하고 있습니다.
(DAO에서 SQL호출시에도 Map으로 파라미터 전달)
문제의 내용은 MyBatis 에서 동적 쿼리 테그를 사용할 경우에 다음과 같이 컬럼명을 한글로 처리하면
인코딩 에러가 생겨서 동적쿼리 방식을 사용할 수가 없습니다.
(셈플 SQL)
<!-- test 코드 조회 -->
<select id="testCodeSSelect2" parameterType="java.util.Map" resultType="java.util.Map">
SELECT 구분코드
, 상세코드
, 코드명
, 사용여부
FROM TB00_공통코드TMP
WHERE 1=1
<if test=' 구분코드 != null and 구분코드 != "" '> <======== 이부분에서 오류 발생
AND 구분코드 = #{구분코드} <======== 이부분에 값은 제대로 맵핑 됩니다.
</if>
</select>
(오류 메시지)
org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.builder.BuilderException: Error evaluating expression '구분코드 != null and 구분코드 != ""'. Cause: org.apache.ibatis.ognl.ExpressionSyntaxException: Malformed OGNL expression: 구분코드 != null and 구분코드 != "" [org.apache.ibatis.ognl.TokenMgrError: Lexical error at line 1, column 1. Encountered: "\uad6c" (44396), after : ""]
=======================================================================
인터넷을 뒤져보니
1. 이클립스의 환경을 UTF-8로 맞춰라 (확인차원에서 다시 다 UTF-8로 맞춤)
2. datasource에서 jdbc:oracle:thin:@192.168.219.195:1521:DB명 뒤에다가
?useUnicode=true&characterEncoding=utf8 를 붙여라 (붙이면 DB 컨넥션시 오류 발생)
3. web.xml 에 필터 추가해라 (이미 추가되어 있음)
<filter>
<filter-name>CharacterEncodingFilter</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
<init-param>
<param-name>forceEncoding</param-name>
<param-value>true</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>CharacterEncodingFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
현재까지는 이 시도들은 모두 해 본 상태입니다.
혹시 Mybatis에서는 동적쿼리 테그에서 한글을 사용 못하는건가요? 아니면 방법이 있다면
뭐를 더 확인해 봐야 할까요?
아니면 ibatis로 하면 동적쿼리 테그 사용시 한글문제를 해결할수 있을까요?
A
안녕하십니까, 표준프레임워크센터입니다.
<if test=' 구분코드 != null and 구분코드 != "" '>
를
<if test="구분코드 != null and 구분코드 !=''">
아래처럼 변경해서
해보셨나요?
MyBatis 한글컬럼은 지원 가능합니다.
보통 저 에러는 따옴표를 잘못 넣었을 경우 발생합니다.
감사합니다.
<if test=' 구분코드 != null and 구분코드 != "" '>
를
<if test="구분코드 != null and 구분코드 !=''">
아래처럼 변경해서
해보셨나요?
MyBatis 한글컬럼은 지원 가능합니다.
보통 저 에러는 따옴표를 잘못 넣었을 경우 발생합니다.
감사합니다.