• 【Oracle 中foreach 与choose组合使用】


    Oracle相关
    • < foreach> 与 < choose> 组合使用实现sql遍历

    ​ 业务背景:前端的单选框改为多选,传递值也通过逗号拼接成字符串传到后端,

    这个时候需求类型可能会有两种,第一种是前端传递的是后端字段值,比如name为字段名,"张三"就是字段值,我们用in查询即可,注意,Oracle 的in长度不会超过1000(当然,前端多选一般数量很少)

                <if test="lineIdList != null and lineIdList.size() != 0">
                    and LINE.ACC_PAYABLE_ID in
                    <foreach collection="lineIdList" item="payableLineId" open="(" separator="," close=")">
                        #{payableLineId}
                    </foreach>
                </if>
    

    这种写法就相当于 select a from line where line.ACC_PAYABLE_ID in ('张三',‘bgff’);

    上面的对应 line.ACC_PAYABLE_ID in (''张三'',"bgff") 这部分,lineIdList 则是List< Long> 的形式,里面存的多个行id。

    第二种则是相反,前端传的是字段名,不是字段值,比如我现在要查询多个时间段,有半年内,半年到一年,一年到两年等等,前端传递的通常是 halfYear,oneYear这种字段名对应code,偏偏后台数据库是把账龄金额存储在对应的字段内(反人类设定),这个时候可以这样写:不要用逗号分割,用OR 分割形成多个 choose - when ,每个choose when都可以用于匹配对应的字段

           <if test="agingList != null and agingList.size() != 0">
                    AND
                    <foreach collection="agingList" item="agingDaysPe" open="(" separator=" OR " close=")">
                        <choose>
                            <when test='agingDaysPe == "halfYear"'>
                                 LINE.AGING_IN_HALF_YEAR is not null
                            </when>
                            <when test='agingDaysPe == "oneYear"'>
                                 LINE.AGING_HALF_TO_YEAR is not null
                            </when>
                            <when test='agingDaysPe == "twoYear"'>
                                 LINE.AGING_ONE_TO_TWO is not null
                            </when>
                            <when test='agingDaysPe == "threeYear"'>
                                 LINE.AGING_TWO_TO_THREE is not null
                            </when>
                            <when test='agingDaysPe == "fourYear"'>
                                 LINE.AGING_THREE_TO_FOUR is not null
                            </when>
                            <when test='agingDaysPe == "fiveYear"'>
                                 LINE.AGING_FOUR_TO_FIVE is not null
                            </when>
                            <when test='agingDaysPe == "moreThan"'>
                                 LINE.AGING_OVER_FIVE is not null
                            </when>
                        </choose>
                    </foreach>
                </if>
    

    agingList 是一个List< String>,里面存的是 halfYear 这种字段名,对应表内字段为AGING_IN_HALF_YEAR,以此类推,前端传递 halfYear,oneYear时 后端就查询返回 halfYear,oneYear这两个字段有值的数据行,即账龄金额所在时间区间。

    ​ foreach的separator除了逗号外还可以填入很多东西,比如 AND,OR,甚至UNION ALL (foreach里面写的是select语句),如果出现报错:表达式缺失,那就看一下and,or这些标识符位置是否正确,比如我之前用逗号进行 分割,发现一直报错 “badsql,表达式缺失”,后来换成 separator=" OR " 也报错,发现应该把and 放在foreach标签外面。

  • 相关阅读:
    Springboot | 私人订制你的banner
    模块化系列教程 | 深入源码分析阿里JarsLink1.0模块化框架
    Nutz | Nutz项目整合Spring实战
    Shrio | java.io.IOException: Resource [classpath:shiro.ini] could not be found
    手把手写框架入门(一) | 核心拦截器DispatchFilter实现
    Rabbitmq | ConnectionException:Connection refused: connect
    Spring Cloud学习总结(非原创)
    Spring Cloud Stream介绍-Spring Cloud学习第八天(非原创)
    Spring Cloud Bus介绍--Spring Cloud学习第七天(非原创)
    分布式配置中心介绍--Spring Cloud学习第六天(非原创)
  • 原文地址:https://www.cnblogs.com/dabuliu/p/16397558.html
Copyright © 2020-2023  润新知