• ORACLE中关于使用between在MyBatis中取不同的区间值和取反


    最近在项目中使用between取不同的区间值问题,由于区间跨度大,而且区间多,又是前端传过来的参数,所以使用in和exists比较麻烦。然后就考虑使用between。现将使用方法记录一下。

    假如表有个字段param_key,参数区间值为:100-300、1000-1999、3050-5000。

    首先是between的用法是:param_key between value1 and value2。如果是有多个between则是:param_key between 100 and 300 and param_key between 1000 and 1999 and param_key between 3050 and 5000。

    这杨很容易理解,也能很容易知道怎么写SQL,比较麻烦的就是我们使用的是Mybatis,所以拼接动态SQL和参数的传递方式很重要。

    首先我们会想到使用mybatis的foreach去遍历。但是参数是param_key,所以就会想到把区间值给拆分成两部分来传递。具体作法如下:

    1.首先创建一个类,用来封装区间值:

    public class ParamKey{
        private String startKey;
        private String endKey;
        
        //getter,setter
    }

    2.创建请求类:

    public class ParamRequest{
        private List<ParamKey>  key;//不同区间值的集合
        private String operator;//1:取区间值,0:取反
        private String code;//区间值代码  
        //getter,setter
    }

    3.业务处理:

    public class ServiceImpl{
        
        public void queryData( ParamRequest request){
             //假如区间值是:100-200,3000-4500,5005-5020
             request.setCode("[100-200],[3000-4500],[5005-5020]");
             request.setOperator('1');
             List<ParamKey> list = new ArrayList<>();
             String code = request.getCode();
             String [] aplit = code.split(",");
             for( int i = 0 ; i ++ ; i < aplit.length){
                 ParamKey key = new ParamKey();
                 String [] param = aplit[i].split("-");
                 key.setStartKey(param[0].subString(1,param[0].length));
            key.setEndKey(param[1].subString(0,param[1].length-1));
            list.add(key);
             }
         request.setKey(list);
                   
        
        //业务处理,调用dao层方法
        }
    }                

    4.Mybatis中SQL:

      <where>
               1=1 
                <choose>
                    <when test="operator == 1">
                    and (
               <!-- 取区间值 -->
                      <foreach collection="key" index="index" item="item" open="" separator="or" close="">
                              param_key between #{item.startKey} and #{item.endKey} 
                      </foreach>
                        )
                    </when>
                    <when test="operator == 0">
                    and (
                <!-- 取区间值之外的 -->
                      <foreach collection="param.codes" index="index" item="item" open="" separator="and" close="">
                          param_key not between #{item.startKey} and #{item.endKey}
                      </foreach>
                        )
                    </when>
                </choose>
            </where>
  • 相关阅读:
    洛谷P1129 [ZJOI2007] 矩阵游戏(二分图最大匹配)
    牛客NC51316 Going Home (二分图最大权匹配)
    洛谷P2055 [ZJOI2009]假期的宿舍(二分图最大匹配)
    Codeforces Round #702 (Div. 3) 全部七题
    Educational Codeforces Round 104 (Rated for Div. 2) A~D
    Leetcode 567. 字符串的排列(滑动窗口)
    基于macOS Catalina 10.15.7下GitHub Pages + Hexo 5.3.0 + 阿里云的博客部署
    关于两个数的LCM
    2021牛客寒假算法基础集训营1 补题 ABCEFIJ
    macOS上运行jupyter notebook程序:服务似乎挂掉了,但是会立刻重启 报错OMP: Error #15: Initializing libomp.dylib, but found libiomp5.dylib already initialize
  • 原文地址:https://www.cnblogs.com/whx20100101/p/10337859.html
Copyright © 2020-2023  润新知