使用mybatis框架程序不支持查询可使用视图

一,在开发中我们使用union函数或者union all使用分页插件进行分页会出现错误如下:

  SELECT * FROM (SELECT
            a.T_POM_JOB_ACT_PRODUCT_ID,
            a.T_POM_JOB_ORDER_ID,
            a.PRODUCT_SORT,
            e.DOC_NO,
            a.PRODUCT_SN,
            a.M_COM_MATERIAL_ID,
            c.MATERIAL_NAME,
            c.MATERIAL_NO,
            a.DOC_STATUS,
            e.EST_DELIVERY_DT,
            a.PRODUCT_STATUS,
            d.DICT_NAME as productStatusName,
            e.MACHINE_NO,
            e.MACHINE_TYPE,
            e.VOLTAGE,
            s.SEG_NAME,
            s.SEG_CODE,
            s.OPERATION_TYPE,
            e.SCH_START_DT
            FROM
            t_pom_job_act_product a
            LEFT JOIN m_com_material c ON a.M_COM_MATERIAL_ID = c.M_COM_MATERIAL_ID
            LEFT JOIN t_pom_job_order e ON a.T_POM_JOB_ORDER_ID = e.T_POM_JOB_ORDER_ID
            LEFT JOIN m_com_process_seg s ON a.M_WORKFLOW_SPEC_LAST_NODE_ID = s.M_COM_PROCESS_SEG_ID
            LEFT JOIN m_data_dict d on d.DICT_CODE = a.PRODUCT_STATUS and d.DICT_TYPE = 'PRODUCT_STATUS'
            where
                a.PRODUCT_STATUS = "START"
                AND
                e.FEVOR = "206"
                    AND a.M_WORKFLOW_SPEC_LAST_NODE_ID in
                    <foreach collection="specLastNodeIdList" index="index" item="item" open="(" separator="," close=")">
                        #{item}
                    </foreach>
            UNION
            SELECT
            a.T_POM_JOB_ACT_PRODUCT_ID,
            a.T_POM_JOB_ORDER_ID,
            a.PRODUCT_SORT,
            e.DOC_NO,
            a.PRODUCT_SN,
            a.M_COM_MATERIAL_ID,
            c.MATERIAL_NAME,
            c.MATERIAL_NO,
            a.DOC_STATUS,
            e.EST_DELIVERY_DT,
            a.PRODUCT_STATUS,
            d.DICT_NAME as productStatusName,
            e.MACHINE_NO,
            e.MACHINE_TYPE,
            e.VOLTAGE,
            s.SEG_NAME,
            s.SEG_CODE,
            s.OPERATION_TYPE,
            e.SCH_START_DT
            FROM
            t_pom_job_act_product a
            LEFT JOIN m_com_material c ON a.M_COM_MATERIAL_ID = c.M_COM_MATERIAL_ID
            LEFT JOIN t_pom_job_order e ON a.T_POM_JOB_ORDER_ID = e.T_POM_JOB_ORDER_ID
            LEFT JOIN m_com_process_seg s ON a.M_WORKFLOW_SPEC_LAST_NODE_ID = s.M_COM_PROCESS_SEG_ID
            LEFT JOIN m_data_dict d on d.DICT_CODE = a.PRODUCT_STATUS and d.DICT_TYPE = 'PRODUCT_STATUS'
            where
                a.PRODUCT_STATUS != "START" AND a.PRODUCT_STATUS != "Outbound"
                AND
                e.FEVOR = "206"
                    AND a.WORK_STATION = #{workStation}
            ) AS b
            <where>
                <if test="date != null and date != ''">
                    AND DATE_FORMAT(b.SCH_START_DT,'%Y-%m-%d')  <![CDATA[<= ]]>  #{date}
                </if>
                <if test="productSn != null and productSn != ''">
                    AND b.PRODUCT_SN like concat ('%',#{productSn},'%')
                </if>
                <if test="docNo != null and docNo != ''">
                    AND b.DOC_NO like concat ('%',#{docNo},'%')
                </if>
            </where>
            ORDER BY b.PRODUCT_SORT ASC

这个查询在使用分页插件时会出问题

二:我们可以建视图进行查询这样可以避免这个错误

视图如下:

select '01' AS `query_type`,`a`.`WORK_STATION` AS `work_station`,`a`.`IS_DELETED` AS `is_deleted`,`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` AS `m_workflow_spec_last_node_id`,`a`.`T_POM_JOB_ACT_PRODUCT_ID` AS `t_pom_job_act_product_id`,`a`.`T_POM_JOB_ORDER_ID` AS `t_pom_job_order_id`,`a`.`PRODUCT_SORT` AS `product_sort`,`e`.`DOC_NO` AS `doc_no`,`a`.`PRODUCT_SN` AS `product_sn`,`a`.`M_COM_MATERIAL_ID` AS `m_com_material_id`,`c`.`MATERIAL_NAME` AS `material_name`,`c`.`MATERIAL_NO` AS `material_no`,`a`.`DOC_STATUS` AS `doc_status`,`e`.`EST_DELIVERY_DT` AS `est_delivery_dt`,`a`.`PRODUCT_STATUS` AS `product_status`,`d`.`DICT_NAME` AS `productstatusname`,`e`.`MACHINE_NO` AS `machine_no`,`e`.`MACHINE_TYPE` AS `machine_type`,`e`.`VOLTAGE` AS `voltage`,`s`.`SEG_NAME` AS `seg_name`,`s`.`SEG_CODE` AS `seg_code`,`s`.`OPERATION_TYPE` AS `operation_type`,`e`.`SCH_START_DT` AS `sch_start_dt` from ((((`t_pom_job_act_product` `a` left join `m_com_material` `c` on((`a`.`M_COM_MATERIAL_ID` = `c`.`M_COM_MATERIAL_ID`))) left join `t_pom_job_order` `e` on((`a`.`T_POM_JOB_ORDER_ID` = `e`.`T_POM_JOB_ORDER_ID`))) left join `m_com_process_seg` `s` on((`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` = `s`.`M_COM_PROCESS_SEG_ID`))) left join `m_data_dict` `d` on(((`d`.`DICT_CODE` = `a`.`PRODUCT_STATUS`) and (`d`.`DICT_TYPE` = 'PRODUCT_STATUS')))) where ((`a`.`PRODUCT_STATUS` = 'Start') and (`e`.`FEVOR` = '206')) union select '02' AS `query_type`,`a`.`WORK_STATION` AS `work_station`,`a`.`IS_DELETED` AS `is_deleted`,`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` AS `m_workflow_spec_last_node_id`,`a`.`T_POM_JOB_ACT_PRODUCT_ID` AS `t_pom_job_act_product_id`,`a`.`T_POM_JOB_ORDER_ID` AS `t_pom_job_order_id`,`a`.`PRODUCT_SORT` AS `product_sort`,`e`.`DOC_NO` AS `doc_no`,`a`.`PRODUCT_SN` AS `product_sn`,`a`.`M_COM_MATERIAL_ID` AS `m_com_material_id`,`c`.`MATERIAL_NAME` AS `material_name`,`c`.`MATERIAL_NO` AS `material_no`,`a`.`DOC_STATUS` AS `doc_status`,`e`.`EST_DELIVERY_DT` AS `est_delivery_dt`,`a`.`PRODUCT_STATUS` AS `product_status`,`d`.`DICT_NAME` AS `productstatusname`,`e`.`MACHINE_NO` AS `machine_no`,`e`.`MACHINE_TYPE` AS `machine_type`,`e`.`VOLTAGE` AS `voltage`,`s`.`SEG_NAME` AS `seg_name`,`s`.`SEG_CODE` AS `seg_code`,`s`.`OPERATION_TYPE` AS `operation_type`,`e`.`SCH_START_DT` AS `sch_start_dt` from ((((`t_pom_job_act_product` `a` left join `m_com_material` `c` on((`a`.`M_COM_MATERIAL_ID` = `c`.`M_COM_MATERIAL_ID`))) left join `t_pom_job_order` `e` on((`a`.`T_POM_JOB_ORDER_ID` = `e`.`T_POM_JOB_ORDER_ID`))) left join `m_com_process_seg` `s` on((`a`.`M_WORKFLOW_SPEC_LAST_NODE_ID` = `s`.`M_COM_PROCESS_SEG_ID`))) left join `m_data_dict` `d` on(((`d`.`DICT_CODE` = `a`.`PRODUCT_STATUS`) and (`d`.`DICT_TYPE` = 'PRODUCT_STATUS')))) where ((`a`.`PRODUCT_STATUS` <> 'Start') and (`a`.`PRODUCT_STATUS` <> 'Outbound') and (`e`.`FEVOR` = '206'))

三:代码里面使用查询

  SELECT * FROM v_pom_job_act_product
        <where>1=1
            AND
            ((query_type = '01'
            <if test="specLastNodeIdList != null and specLastNodeIdList.size() != 0">
                AND m_workflow_spec_last_node_id in
                <foreach collection="specLastNodeIdList" index="index" item="item" open="(" separator="," close=")">
                    #{item}
                </foreach>
            </if>
            )
            OR
            (query_type = '02' and work_station = #{workStation} ))
            <if test="date != null and date != ''">
                AND ( DATE_FORMAT(sch_start_dt,'%Y-%m-%d')  <![CDATA[<= ]]>
                #{date})
            </if>
            <if test="productSn != null and productSn != ''">
                AND (product_sn like concat ('%',#{productSn},'%'))
            </if>
            <if test="docNo != null and docNo != ''">
                AND (doc_no like concat ('%',#{docNo},'%'))
            </if>
        </where>
        ORDER BY product_sort ASC,product_sn ASC

就可以实现

猜你喜欢

转载自blog.csdn.net/LRXmrlirixing/article/details/128590414
今日推荐