Mybatis : "less than" issue in Select annotations

Om. picture Om. · Mar 17, 2015 · Viewed 23.1k times · Source

I am using java7, spring 3 and mybatis

Pom.xml

<org.mybatis-version>3.2.8</org.mybatis-version>
<org.mybatis-spring-version>1.2.2</org.mybatis-spring-version>

<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis</artifactId>
    <version>${org.mybatis-version}</version>
</dependency>
<dependency>
    <groupId>org.mybatis</groupId>
    <artifactId>mybatis-spring</artifactId>
    <version>${org.mybatis-spring-version}</version>
</dependency>

While using annotation based Select i came across with strange issue where below mentioned code was throwing exception due to use of < (Less then) while > (greater then) works as expected.

<script>
SELECT * FROM STUDENT
WHERE DEPARTMENT_ID = #{depId}
<if test='joiningDate != null'> AND STUDENT_ID <= #{joiningDate} </if>
</script>

After googling for a while i find out this issue reported below.

https://code.google.com/p/mybatis/issues/detail?id=787

Above issue can be fixed by replacing < (less then) with &lt; as shown below.

<script>
SELECT * FROM STUDENT
WHERE DEPARTMENT_ID = #{depId}
<if test='joiningDate != null'> AND STUDENT_ID &lt;= #{joiningDate} </if>
</script>

I have also came across of suggestion for using using CDATA or ^ in respected scenarios which i haven't given try yet.

Question:

  • My question is shouldn't this issue be fixed by Mybatis team (at-least xml specific conversion for frequently used query tags) or this behaviour is as expected since we are using <script> tag ??
  • Is there any alternate solution which i have missed out ?

Answer

Landys picture Landys · Mar 19, 2015

To be fair, it's not the issue in MyBatis, but the behaviour of XML parsing.

If you don't want characters such as < and & to be parsed, you can use the term CDATA to prevent the XML parser to parse such text. Please refer to http://www.w3schools.com/xml/xml_cdata.asp for detail. Or you may escape it with &lt as comments.

I.E.

<script>
SELECT * FROM STUDENT
WHERE DEPARTMENT_ID = #{depId}
<if test='joiningDate != null'> 
<![CDATA[
AND STUDENT_ID <= #{joiningDate} 
]]>
</if>
</script>