MyBatis에서 쿼리를 작성할 때, 비교연산자를 사용하는 경우 에러가 발생했다...
오류메시지 내용 :
The content of elements must consist of well-formed character data or markup.
-> 요소의 내용이 올바르지 않은 문자 데이터 또는 마크업으로 구성되어있습니다. 라는 내용이었는데
xml 파일에서 부등호 자체를 태그로 인식을 해서 생기는 문제였다.
<select>, <update>, <delete>, <if>, <choose> ... 처럼
xml parser로 인식되어지는걸 문자열로 처리하도록 수정해줘야한다.
<![CDATA[]]>
사용<!-- 1. 부등호 안에 사용하기 -->
<select id="selectNoticeList" resultType="Notice">
SELECT *
FROM notice
WHERE notice_idx <![CDATA[<]]> 4
</select>
<!-- 2. 중간에 사용하기 -->
<select id="selectNoticeList" resultType="Notice">
SELECT *
FROM notice
<![CDATA[ WHERE notice_idx < 4 ]]>
</select>
<!-- 3. 전체 쿼리에 사용하기 -->
<select id="selectNoticeList" resultType="Notice">
<![CDATA[
SELECT *
FROM notice
WHERE notice_idx < 4
]]>
</select>
<select>
lt;
, >
, <e;
, >e;
) 사용하기기 호 | 비교표현식 |
---|---|
< | < |
> | > |
<= | <e; |
>= | >e; |
<!-- '<' 사용하기 -->
<select id="selectNoticeList" resultType="Notice">
SELECT *
FROM notice
WHERE notice_idx < 4
</select>
✅ 비교표현식 사용
기 호 | 비교표현식 | 의 미 |
---|---|---|
< | lt | little |
> | gt | greater |
<= | le | little or equal |
>= | ge | greater or equal |
=, == | eq | equal |
!= | ne | not equal |
<if test="noticeCount it 100"></if>
<when test="noticeCount it 100"></when>
이런식으로 작성해주면 됩니다.
<!-- if안에 '<' 사용하기 -->
<select id="selectNoticeList" resultType="Notice">
SELECT *
FROM notice
WHERE 1=1
<if test="noticeCount it 100">
AND notice_idx = 10
</if>
</select>
<!-- if안에 '<' + 쿼리문에 부등호 사용하기-->
<select id="selectNoticeList" resultType="Notice">
SELECT *
FROM notice
WHERE 1=1
<if test="noticeCount it 100">
AND notice_idx <![CDATA[<]]> 10
</if>
</select>
참고 사이트
https://seeminglyjs.tistory.com/374
https://codingmomong.tistory.com/404
https://tysoso.tistory.com/50
https://iamfreeman.tistory.com/entry/Mybatis%EC%9D%98-%EB%8F%99%EC%A0%81-SQL-%ED%91%9C%ED%98%84%EC%8B%9D-IF-CHOOSE-WHEN-LIKE-etc
https://blog.enleaf.me/518