현상: MyBatis에서 아래처럼 SQL시 테이블 별명을 사용하려고 했다.
SELECT
M.CLUB_NO,
C.CLUB_NM,
M.I_DATE,
M.I_USER,
M.U_DATE,
M.U_USER,
M.USE_YN,
M.USER_AUTH,
M.USER_NO
FROM 테이블1 M, 테이블2 C
WHERE
M.USER_NO = 유저번호
AND M.USE_YN = 'Y'
AND C.USE_YN = 'Y'
AND M.CLUB_NO = C.CLUB_NO;
Oracle DB로 개발 중이므로, Sqldeveloper에서 쿼리 실행시에는 문제가 없었는데,
MyBatis로 동작시키니 BadSqlGrammarException:~~~ 이 뜨면서 에러가 발생했다.
해결: 다른 프로젝트에서 <!cdata[ ~~~~~ ]>를 사용하는건 문제가 없길래 그대로 적용해보니 해결되었다.
Q. 그렇다면 <!cdata는 왜 쓰는걸까?
출처: https://javacpro.tistory.com/5 [버물리의 IT공부]
Mybatis 사용시 쿼리문에 문자열 비교연산자나 부등호를 처리할 때가있습니다.
그러면 < 와 같은 기호를 괄호인지 아니면 비교연산자 인지 확인이 되지않아요.
이외에도 특수문자 사용하는데 제한이있습니다.
<select id ="list" parameterType="int" resultType="board.test.testDto> select * from employees where salary > 100 </select>
|
대략 이런식으로요
이럴때 사용한것이 <![CDATA[ 입니다.
CDATA 안에 들어가는 문장을 문자열로 인식하게 합니다.
<select id = "list" parameterType="int" resultType="board.test.testDto> <![CDATA[ select * from employees where salary > 100 ]]> </select> |
이렇게 사용하면 SQL안에 특수문자가 들어가도 문자열로 인식하기때문에
문제를 해결할수있습니다.
출처: https://javacpro.tistory.com/5 [버물리의 IT공부
<![CDATA[ 로 해결되었다는건, 그냥 <select>문 안에 쓰게 되면, mapper가 테이블 별명을 제대로 해석을 못하는건가 싶다.