zoukankan      html  css  js  c++  java
  • 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的,整理完毕

  • 相关阅读:
    SQL Server 与 Entity Framework 级联删除
    web api 2 学习笔记 (Odata ODataQueryOptions 使用)
    【建议收藏】设计师必备-史上最全的个人资料页面设计模板下载
    浅谈产品经理入门和学习路径
    最全面!2019年最新UX设计趋势预测合集
    最新Dashboard设计实例、技巧和资源集锦,视觉和功能两不误,妥妥的!
    【技巧分享】设计师如何向开发人员顺利交付作品?
    摹客iDoc201901-2新功能点评
    企业类Web原型制作分享-Kraftwerk
    【新年福利】2019年值得一用的8款协作工具
  • 原文地址:https://www.cnblogs.com/mecca/p/3651266.html
Copyright © 2011-2022 走看看