首页 > 其他 > 详细

Ibatis动态查询-and和or的使用

时间:2014-04-08 22:22:51      阅读:718      评论:0      收藏:0      [点我收藏+]

这几天做项目,有一个同时筛选创建人和申请人的逻辑,但是这个sql是公用的,也就是说得用dynamic动态语句,而这两个人员属性不一定是固定的,所以得动态+and+or,之前想的是

bubuko.com,布布扣
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>
bubuko.com,布布扣

但是结果总是不尽人意,申请人的地方查出来的时候总是不对应,看控制台输出发现仅仅一条记录,也会在后台显示查出好多(虽然最后页面显示是一个),个人感觉应该是and和or的查询产生了冗余,必须优化,然后google,找到一篇文章

ibatis and和or联合查询 

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

语法来控制筛选条件,产生

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

语句,很明显符合我的需求啊,修改为

bubuko.com,布布扣

    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>
bubuko.com,布布扣

可是运行后发现提示sql命令没有正常结束,仔细查看发现我的前两个条件是没有传的,所以整个语句排下来是没有where的,这……绝对是错的啊,最后修改为:

bubuko.com,布布扣
 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>
bubuko.com,布布扣

正常,后台和前台个数相同,还需要注意的一点就是dynamic是不能够嵌套dynamic的,整理完毕

 

Ibatis动态查询-and和or的使用,布布扣,bubuko.com

Ibatis动态查询-and和or的使用

原文:http://www.cnblogs.com/mecca/p/3651266.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!