Ibatis動態查詢-and和or的使用


這幾天做項目,有一個同時篩選創建人和申請人的邏輯,但是這個sql是公用的,也就是說得用dynamic動態語句,而這兩個人員屬性不一定是固定的,所以得動態+and+or,之前想的是

select count(1) as count
from E_TM_APPLY 

<dynamic prepend="where">

<isNotNull prepend="AND" property="raStartTime">
RA_START_TIME &gt;= #raStartTime:TIMESTAMP# 
</isNotNull>
<isNotNull prepend="AND" property="raEndTime">
RA_END_TIME &lt;= #raEndTime:TIMESTAMP# 
</isNotNull>

<isNotNull prepend="AND" property="raUserId">
RA_USER_ID=#raUserId# 
</isNotNull>
<isNotNull prepend="OR" property="createUserId">
CREATE_USER_ID =#createUserId# 
</isNotNull>

</dynamic>

但是結果總是不盡人意,申請人的地方查出來的時候總是不對應,看控制台輸出發現僅僅一條記錄,也會在后台顯示查出好多(雖然最后頁面顯示是一個),個人感覺應該是and和or的查詢產生了冗余,必須優化,然后google,找到一篇文章

ibatis and和or聯合查詢 

可以使用<dynamic prepend="and" open="(" close=")">

語法來控制篩選條件,產生

select * from table where xxx = "xxx" and (xxx="xxx" or xx1="xx1")

語句,很明顯符合我的需求啊,修改為

 
         

    select count(1) as count

     from E_TM_APPLY

 <dynamic prepend="WHERE"> <isNotNull prepend="AND" property="raStartTime"> RA_START_TIME &gt;= #raStartTime:TIMESTAMP# </isNotNull>
        <isNotNull prepend="AND" property="raEndTime"> RA_END_TIME &lt;= #raEndTime:TIMESTAMP# </isNotNull>
  </dynamic>
<dynamic prepend="AND" open="(" close=")"> <isNotNull prepend="OR" property="raUserId"> RA_USER_ID=#raUserId# </isNotNull> <isNotNull prepend="OR" property="createUserId"> CREATE_USER_ID =#createUserId# </isNotNull> </dynamic>

可是運行后發現提示sql命令沒有正常結束,仔細查看發現我的前兩個條件是沒有傳的,所以整個語句排下來是沒有where的,這……絕對是錯的啊,最后修改為:

 select count(1) as count
    from E_TM_APPLY
    where 1=1 
        <isNotNull prepend="AND" property="raStartTime">
            RA_START_TIME &gt;= #raStartTime:TIMESTAMP# 
       </isNotNull>
        <isNotNull prepend="AND" property="raEndTime">
            RA_END_TIME &lt;= #raEndTime:TIMESTAMP# 
       </isNotNull>
     <dynamic prepend="AND" open="(" close=")">
       <isNotNull prepend="OR" property="raUserId">
       RA_USER_ID=#raUserId# 
           </isNotNull>
       <isNotNull prepend="OR" property="createUserId">
       CREATE_USER_ID =#createUserId# 
       </isNotNull>
       </dynamic>
  </select>

正常,后台和前台個數相同,還需要注意的一點就是dynamic是不能夠嵌套dynamic的,整理完畢

 


免責聲明!

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



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