初めに
MyBatisはXMLファイルにSQL文を定義して使用するが、XMLなので<や>は使えない。
それに気づかずエラー吐いて、
なんでや!コンソールでこのSQL叩いたら正常に実行できたのに!と小一時間悩んだ。
実行環境
- MyBatis 3
- Java 8
エラーになる例
<select id="hoge" resultType="hoge">
SELECT
*
FROM
HOGE
WHERE
HOGE.HOGE_DATE < SYSDATE
</select>
不等号を使っているWHERE句がダメと怒られる。
エラー内容
Cause: org.xml.sax.SAXParseException; lineNumber: XX; columnNumber: XX; 要素のコンテンツは、整形式の文字データまたはマークアップで構成されている必要があります。
改善策①
不等号を使っている箇所をで囲んでしまうという方法。
<select id="hoge" resultType="hoge">
SELECT
*
FROM
HOGE
WHERE
HOGE_DATE <![CDATA[ < ]]> SYSDATE
</select>
改善策②
下の例のようにSELECT句全体を囲んでも良かった。
こっちのほうが可読性は高い。(気がする。)
<select id="hoge" resultType="hoge">
<![CDATA[
SELECT
*
FROM
HOGE
WHERE
HOGE_DATE < SYSDATE
]]>
</select>
改善策③
コメントにて教えていただいたエンティティ参照を使用する方法です。
少し調べたところ、以下の5種類があるようです。
文字 | エンティティ参照 |
---|---|
< | < |
> | > |
& | & |
'(シングルクォーテーション) | ' |
"(ダブルクォーテーション) | " |
エンティティ参照を使用して記載すると、下のようになります。
<select id="hoge" resultType="hoge">
SELECT
*
FROM
HOGE
WHERE
HOGE_DATE < SYSDATE
</select>
終わりに
MyBatisに初めて触っているが、動作確認済のSQLをコピペして、呼び出すだけで使えるので便利。
MyBatis公式ドキュメントが日本語化されており、情報量も豊富なので使いやすい。
if、choose、foreachなどの動的SQLについても後日まとめる予定。