MyBatis中大於號以及小於號的表達方式


場景還原

今天在寫代碼時,因為業務,需要在mybatis中,使用到大於號,小於號,所以就在SQL中直接使用了。 
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE

可是,在執行時,總報錯誤:

Error creating document instance. Cause: org.xml.sax.SAXParseException; lineNumber: 74; columnNumber: 17; 元素內容必須由格式正確的字符數據或標記組成。 
把AND start_date >= CURRENT_DATE AND end_date <= CURRENT_DATE去掉,就沒有問題,所以確定是因為大於號,小於號引起的問題。 
於是就想到了特殊符號,於是用了轉義字符把>和<替換掉,然后就沒有問題了。 
SELECT * FROM test WHERE 1 = 1 AND start_date <= CURRENT_DATE AND end_date >= CURRENT_DATE

實現方案

以下介紹兩種可行方法:

①轉義法

大於:&gt;

小於:&lt;

大於等於:&gt;=

小於等於:&lt;=

筆者案例:

<select id="view" parameterType="map" resultMap="BaseResultMap">
    SELECT * FROM task t,staff s,product p WHERE t.staff_id = s.id AND t.product_id = p.id
    <if test="processId != null">
        AND  t.process_id = #{processId}
    </if>
    <if test="@Ognl@isNotEmpty(equipmentId)">
        AND  t.equipment_id = #{equipmentId}
    </if>
    <if test="dateStart != null and dateStart !='' ">
        AND UNIX_TIMESTAMP(t.date_work)  &gt;= UNIX_TIMESTAMP(#{dateStart})
    </if>
    <if test="dateEnd != null and dateEnd !='' ">
        AND UNIX_TIMESTAMP(t.date_work)  &lt;= UNIX_TIMESTAMP(#{dateEnd})
    </if>
    GROUP BY t.order_no
    ORDER BY t.date_work
</select>

②<![CDATA[  sql語句  ]]>

<![CDATA[  sql語句  ]]>中的<![CDATA[    ]]>在mybatis中自動注釋

筆者案例:

<select id="selectByTime" resultType="Date" parameterType="map">
    SELECT
    r.stop_time
    FROM
    rtg r   <![CDATA[
    WHERE  UNIX_TIMESTAMP(r.stop_time) >= UNIX_TIMESTAMP(#{startTime})
    AND UNIX_TIMESTAMP(r.stop_time) <= UNIX_TIMESTAMP(#{endTime}) ]]>
</select>

以上就是筆者實際需求提煉的心得,望能夠幫助更多的伙伴!

 

原文鏈接:

1、https://blog.csdn.net/weixin_40278209/article/details/78262173?locationNum=10&fps=1

2、https://blog.csdn.net/gisredevelopment/article/details/27870833

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM