這幾天做項目,有一個同時篩選創建人和申請人的邏輯,但是這個sql是公用的,也就是說得用dynamic動態語句,而這兩個人員屬性不一定是固定的,所以得動態+and+or,之前想的是
select count(1) as count from E_TM_APPLY <dynamic prepend="where"> <isNotNull prepend="AND" property="raStartTime"> RA_START_TIME >= #raStartTime:TIMESTAMP# </isNotNull> <isNotNull prepend="AND" property="raEndTime"> RA_END_TIME <= #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,找到一篇文章
可以使用<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 >= #raStartTime:TIMESTAMP# </isNotNull> <isNotNull prepend="AND" property="raEndTime"> RA_END_TIME <= #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 >= #raStartTime:TIMESTAMP# </isNotNull> <isNotNull prepend="AND" property="raEndTime"> RA_END_TIME <= #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的,整理完畢