分页插件结合collection标签后分页数量不准确的问题

问题1:不使用collection 聚合分页正确
简单列子
T_ATOM_DICT表有

idname
1原子1
2原子2
3原子3
4原子4
5原子5
6原子6

T_ATOM_DICT_AUDIT_ROUTE表审核记录表有

idaudit
1拒绝
1通过
4拒绝

我要显示那些原子审核了,我把两个表inner join 就是那些原子审核过了

idnameaudit
1原子1拒绝
1原子1通过
4原子4拒绝

在这里插入图片描述
mapper

    IPage<AtomDict> findAllByAuditRouteNoDuplicate(@Param("criteria") AtomDictQueryCriteria criteria, Page<Object> page);

xml基础的查询类型和返回类型

<!--    分步要用-->
<resultMap id="BaseResultMap" type="com.njry.sjzl.busi.domain.AtomDict">
        <result column="ATOM_ID" property="atomId"/>
        <result column="ATOM_ID" property="id"/>
        <result column="CATEGORY_ID" property="categoryId"/>
        <result column="CATEGORY_NAME" property="categoryName"/>
        <result column="ATOM_NAME" property="atomName"/>
        <result column="TYPE" property="type"/>
        <result column="TYPE_NAME" property="typeName" />
        <result column="DATA_CYCLE" property="dataCycle"/>
        <result column="DATA_CYCLE_NAME" property="dataCycleName"/>
        <result column="LIB_TYPE" property="libType"/>
<!--        <result column="AUDIT_RESULT" property="auditResult"/>-->
<!--        <result column="AUDIT_REMARK" property="auditRemark"/>-->
        <result column="LIB_TYPE_NAME" property="libTypeName"/>
        <result column="DATA_GENE_MODE" property="dataGeneMode"/>
        <result column="DATA_GENE_MODE_NAME" property="dataGeneModeName"/>
        <result column="TEMPLATE_ID" property="templateId"/>
        <result column="TEMPLATE_NAME" property="templateName"/>
        <result column="DATABASE" property="database"/>
        <result column="DATABASE_NAME" property="databaseName"/>
        <result column="DATABASE_TABLE" property="databaseTable"/>
        <result column="COLUMN_NAME" property="columnName"/>
        <result column="TABLE_LEVEL" property="tableLevel"/>
        <result column="PROC_NAME" property="procName"/>
        <result column="IS_HZ" property="isHz"/>
        <result column="STATUS" property="status"/>
        <result column="ATOM_TABLE" property="atomTable"/>
        <result column="MODE_FLAG" property="modeFlag"/>
        <result column="CREATE_ID" property="createId"/>
        <result column="CREATE_DATE" property="createDate"/>
        <result column="REC_ID" property="recId"/>
        <result column="REC_DATE" property="recDate"/>
        <result column="SH_ID" property="shId"/>
        <result column="SH_DATE" property="shDate"/>
        <result column="SH_REMARK" property="shRemark"/>
        <result column="DEL_ID" property="delId"/>
        <result column="DEL_DATE" property="delDate"/>
        <result column="START_DATE" property="startDate"/>
        <result column="END_DATE" property="endDate"/>
        <result column="UNIT" property="unit"/>
        <result column="DIMEN_FLAG" property="dimenFlag"/>
    </resultMap>
    
 <resultMap id="BaseResultMapBoss" type="com.njry.sjzl.busi.domain.AtomDict">
        <result column="ATOM_ID" property="atomId"/>
        <result column="ATOM_ID" property="id"/>
        <result column="CATEGORY_ID" property="categoryId"/>
        <result column="CATEGORY_NAME" property="categoryName"/>
        <result column="ATOM_NAME" property="atomName"/>
        <result column="TYPE" property="type"/>
        <result column="TYPE_NAME" property="typeName" />
        <result column="DATA_CYCLE" property="dataCycle"/>
        <result column="DATA_CYCLE_NAME" property="dataCycleName"/>
        <result column="LIB_TYPE" property="libType"/>
        <result column="LIB_TYPE_NAME" property="libTypeName"/>
        <result column="DATA_GENE_MODE" property="dataGeneMode"/>
        <result column="DATA_GENE_MODE_NAME" property="dataGeneModeName"/>
        <result column="TEMPLATE_ID" property="templateId"/>
        <result column="TEMPLATE_NAME" property="templateName"/>
        <result column="DATABASE" property="database"/>
        <result column="DATABASE_NAME" property="databaseName"/>
        <result column="DATABASE_TABLE" property="databaseTable"/>
        <result column="COLUMN_NAME" property="columnName"/>
        <result column="TABLE_LEVEL" property="tableLevel"/>
        <result column="PROC_NAME" property="procName"/>
        <result column="IS_HZ" property="isHz"/>
        <result column="STATUS" property="status"/>
        <result column="ATOM_TABLE" property="atomTable"/>
        <result column="MODE_FLAG" property="modeFlag"/>
        <result column="CREATE_ID" property="createId"/>
        <result column="CREATE_DATE" property="createDate"/>
        <result column="REC_ID" property="recId"/>
        <result column="REC_DATE" property="recDate"/>
        <result column="SH_ID" property="shId"/>
        <result column="SH_DATE" property="shDate"/>
        <result column="SH_REMARK" property="shRemark"/>
        <result column="DEL_ID" property="delId"/>
        <result column="DEL_DATE" property="delDate"/>
        <result column="START_DATE" property="startDate"/>
        <result column="END_DATE" property="endDate"/>
        <result column="UNIT" property="unit"/>
        <result column="DIMEN_FLAG" property="dimenFlag"/>

    </resultMap>
<!--    <collection property="batchList" resultMap="BatchListResultMap"/>-->
<!--    审核表数据还得关联用户表显示用户名-->
    <resultMap id="BatchListResultMap" type="com.njry.sjzl.busi.domain.AtomDictAuditRoute">
        <result column="ROUTE_ID" property="routeId"/>
        <result column="ROUTE_ID" property="id"/>
        <result column="ATOM_IDREPEAT" property="atomId"/>
        <result column="AUDIT_RESULT" property="auditResult"/>
        <result column="AUDIT_REMARK" property="auditRemark"/>
        <result column="AUDIT_ID" property="auditId"/>
        <result column="AUDIT_NAME" property="auditName"/>
        <result column="AUDIT_DATE" property="auditDate"/>
    </resultMap>
    <sql id="BathList_Column_List">
            auditroute.ROUTE_ID as ROUTE_ID, auditroute.ATOM_ID as ATOM_IDREPEAT, tuser.NAME AS AUDIT_NAME,
         auditroute.AUDIT_RESULT as AUDIT_RESULT, auditroute.AUDIT_REMARK as AUDIT_REMARK,auditroute.AUDIT_ID as AUDIT_ID,auditroute.AUDIT_DATE as AUDIT_DATE
    </sql>
    <sql id="Base_Column_List">
        tad.ATOM_ID, tad.CATEGORY_ID, tad.ATOM_NAME, tad.TYPE, tad.DATA_CYCLE, tad.LIB_TYPE, tad.DATA_GENE_MODE, tad.TEMPLATE_ID, tad.DATABASE_TABLE, tad."DATABASE",tad.COLUMN_NAME, tad.TABLE_LEVEL, tad.PROC_NAME, tad.IS_HZ, tad.STATUS, tad.ATOM_TABLE, tad.MODE_FLAG, tad.CREATE_ID,tad.CREATE_DATE, tad.REC_ID, tad.REC_DATE, tad.SH_ID, tad.SH_DATE, tad.SH_REMARK, tad.DEL_ID, tad.DEL_DATE, tad.START_DATE, tad.END_DATE, tad.UNIT, tad.DIMEN_FLAG
    </sql>
<!--    数据字典回显名字-->
    <sql id="Dict_Detail_Column_List">
        dtable.label AS DATABASE_NAME,
        dtable1.label AS DATA_GENE_MODE_NAME,
        dtable2.label AS LIB_TYPE_NAME,
        dtable3.label AS DATA_CYCLE_NAME,
        dtable4.label AS TYPE_NAME
    </sql>

真正xml如下:关联很多表回显,T_ATOM_TEMPLATE模板表,T_ATOM_BUSI_CATEGORY业务分类,五个字典表,和(原子审核表,原子审核表要关联用户表差审核用户名)

    <select id="findAllByAuditRouteNoDuplicate" resultMap="BaseResultMapBoss">
        select tatempalte.TEMPLATE_NAME,tabc.CATEGORY_NAME AS CATEGORY_NAME,
        <include refid="Base_Column_List"/>,
        <include refid="Dict_Detail_Column_List"/>,
        <include refid="BathList_Column_List"/>
        from T_ATOM_DICT tad
        left join T_ATOM_TEMPLATE tatempalte on tatempalte.TEMPLATE_ID = tad.TEMPLATE_ID
        left join T_ATOM_BUSI_CATEGORY tabc on tad.CATEGORY_ID = tabc.category_id
        left join (select dd.label,dd.value from t_dict d left join t_dict_detail dd on  dd.dict_id = d.dict_id
        where d.name = 'asset_archive_name') dtable
        on tad.DATABASE = dtable.value
        left join (select dd1.label,dd1.value from t_dict d1 left join t_dict_detail dd1 on  dd1.dict_id = d1.dict_id
        where d1.name = 't_atmo_dict_generation_mechanism') dtable1
        on tad.DATA_GENE_MODE = dtable1.value
        left join (select dd2.label,dd2.value from t_dict d2 left join t_dict_detail dd2 on  dd2.dict_id = d2.dict_id
        where d2.name = 't_atmo_dict_atomic_library_type') dtable2
        on tad.LIB_TYPE = dtable2.value
        left join (select dd3.label,dd3.value from t_dict d3 left join t_dict_detail dd3 on  dd3.dict_id = d3.dict_id
        where d3.name = 't_atmo_dict_data_cycle') dtable3
        on tad.DATA_CYCLE = dtable3.value
        left join (select dd4.label,dd4.value from t_dict d4 left join t_dict_detail dd4 on  dd4.dict_id = d4.dict_id
        where d4.name = 't_atmo_dict_data_type') dtable4
        on tad.TYPE = dtable4.value
        inner join (select ATOM_ID,AUDIT_RESULT,AUDIT_REMARK,ROUTE_ID,AUDIT_ID,AUDIT_DATE
        from T_ATOM_DICT_AUDIT_ROUTE) auditroute on auditroute.ATOM_ID =tad.ATOM_ID
        left join t_user tuser on tuser.oper_id = auditroute.AUDIT_ID
        <where>
            <if test="criteria.atomId != null">
                and tad.ATOM_ID = #{criteria.atomId}
            </if>
            <if test="criteria.atomName != null">
                and tad.ATOM_NAME like concat('%'||#{criteria.atomName},'%')
            </if>
        </where>
        order by tad.CREATE_DATE desc, auditroute.AUDIT_DATE asc
    </select>

问题2:使用collection 聚合出现分页问题
xml基础的查询类型和返回类型 里面把注释的

方法返回类型 id = “BaseResultMapBoss” 里

在这里插入图片描述

解决办法1(我最蠢的解决办法,把sql分解)
不知道怎么自定义分页解决这种(不会),
我只能把这一个sql语句分开

在impl层

    @Override
    public PageResult<AtomDict> queryAllByAuditRouteDuplicate(AtomDictQueryCriteria criteria, Page<Object> page){

//        去重 inner join(原来一个sql就该搞定的)
//        IPage<AtomDict> all = atomDictMapper.findAllByAuditRouteNoDuplicate(criteria, page);
//        去重 inner join(分步1)
        IPage<AtomDict> all = atomDictMapper.findAllByAuditRouteNoDuplicateSubstep(criteria, page);

        List<AtomDict> records = all.getRecords();


//        根据每条数据类的busiSort递归向下查找归属业务分类(回显)
//        每条数据类还要找自己的审批过程(分步2)
        if(records.size() > 0 ){
            for (int i = 0; i < records.size(); i++) {
                AtomDict atomDict = records.get(i);
                if(atomDict != null){
                    Set<String> taskSetResult  = new LinkedHashSet<>();
                    Long categoryId = atomDict.getCategoryId();
//        			这里拿到第一步去重的审核原子再去查审核记录,放在返回前端的BatchList 里面
                    List<AtomDictAuditRoute> atomDictAuditRoutes = atomDictMapper.selectBath(atomDict.getAtomId());
                    atomDict.setBatchList(atomDictAuditRoutes);
                    if(categoryId != null){
                        List<String> subCategory = atomBusiCategoryMapper.findSubCategory(categoryId);
                        String currentCategoryName = atomBusiCategoryMapper.findCategoryNameByCateforyId(categoryId);
                        taskSetResult.addAll(subCategory);
                        taskSetResult.add(currentCategoryName);
                        String temp = "";
                        for(String item : taskSetResult){
                            temp += ","+item;
                        }
                        String result = temp.substring(1);
                        atomDict.setCategoryName(result);
                    }
                }
            }
        }
        return PageUtil.toPage(all);
    }

mapper

    IPage<AtomDict> findAllByAuditRouteNoDuplicateSubstep(@Param("criteria") AtomDictQueryCriteria criteria, Page<Object> page);



    List<AtomDictAuditRoute> selectBath(@Param("atomId") String atomId);

xml

<!--    关联审核表确定原子已经审核,因为原子审核触发,在原子表没有字段判断是否审核字段修改,才导致要关联审核记录表判断(关键还得去重):和原来区别就是不collection并且去重-->
    <select id="findAllByAuditRouteNoDuplicateSubstep" resultMap="BaseResultMap">
        select stupid.* from (
            select row_number() over(partition by tad.ATOM_ID order by tad.CREATE_DATE desc) rn,tatempalte.TEMPLATE_NAME,tabc.CATEGORY_NAME AS CATEGORY_NAME,
            <include refid="Base_Column_List"/>,
            <include refid="Dict_Detail_Column_List"/>
            from T_ATOM_DICT tad
            left join T_ATOM_TEMPLATE tatempalte on tatempalte.TEMPLATE_ID = tad.TEMPLATE_ID
            left join T_ATOM_BUSI_CATEGORY tabc on tad.CATEGORY_ID = tabc.category_id
            left join (select dd.label,dd.value from t_dict d left join t_dict_detail dd on  dd.dict_id = d.dict_id
            where d.name = 'asset_archive_name') dtable
            on tad.DATABASE = dtable.value
            left join (select dd1.label,dd1.value from t_dict d1 left join t_dict_detail dd1 on  dd1.dict_id = d1.dict_id
            where d1.name = 't_atmo_dict_generation_mechanism') dtable1
            on tad.DATA_GENE_MODE = dtable1.value
            left join (select dd2.label,dd2.value from t_dict d2 left join t_dict_detail dd2 on  dd2.dict_id = d2.dict_id
            where d2.name = 't_atmo_dict_atomic_library_type') dtable2
            on tad.LIB_TYPE = dtable2.value
            left join (select dd3.label,dd3.value from t_dict d3 left join t_dict_detail dd3 on  dd3.dict_id = d3.dict_id
            where d3.name = 't_atmo_dict_data_cycle') dtable3
            on tad.DATA_CYCLE = dtable3.value
            left join (select dd4.label,dd4.value from t_dict d4 left join t_dict_detail dd4 on  dd4.dict_id = d4.dict_id
            where d4.name = 't_atmo_dict_data_type') dtable4
            on tad.TYPE = dtable4.value
            inner join (select ATOM_ID,AUDIT_RESULT,AUDIT_REMARK,ROUTE_ID,AUDIT_ID,AUDIT_DATE
            from T_ATOM_DICT_AUDIT_ROUTE) auditroute on auditroute.ATOM_ID =tad.ATOM_ID
            left join t_user tuser on tuser.oper_id = auditroute.AUDIT_ID
            <where>
                <if test="criteria.atomId != null">
                    and tad.ATOM_ID = #{criteria.atomId}
                </if>
                <if test="criteria.atomName != null">
                    and tad.ATOM_NAME like concat('%'||#{criteria.atomName},'%')
                </if>
            </where>
        ) stupid
        where stupid.rn = 1
    </select>



    <select id="selectBath" resultMap="BatchListResultMap">
        select <include refid="BathList_Column_List"/>
        from (select ATOM_ID,AUDIT_RESULT,AUDIT_REMARK,ROUTE_ID,AUDIT_ID,AUDIT_DATE
        from T_ATOM_DICT_AUDIT_ROUTE) auditroute
        left join t_user tuser on tuser.oper_id = auditroute.AUDIT_ID
        where auditroute.ATOM_ID = #{atomId}
    </select>

解决方法2(设计表时候应该加一个冗余字段)
我仔细想了一下,都是因为T_ATOM_DICT这个原子表缺少一个是否审核字段,(只要触发审核,就修改这个原子是否审核的状态)如果加这个字段就可以直接用collection收集这个原子的审批记录

解决方法3就是我不会的那种,求路过大神指教

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/724893.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

“Photoshop AI插件:StartAI的全面使用攻略

随着人工智能技术的飞速发展&#xff0c;Photoshop作为设计师们不可或缺的工具&#xff0c;也在不断地融入AI技术&#xff0c;以提升设计效率和效果。在2024年&#xff0c;PSAI插件StartAI因其强大的功能和易用性&#xff0c;成为了Photoshop用户的得力帮手。下面来给大家详细介…

Linux安装kvm虚拟机

kvm是基于内核的虚拟机&#xff0c;为什么要用kvm不用vmware、virtual box… 只有一个原因&#xff0c;它非常快&#xff01;本机使用linux开发也是因为它快&#xff01;linux在老电脑上都能流畅运行&#xff0c;更别说现代电脑&#xff0c;如果你觉得装Linux并没有比win快多少…

企业设备管理现状与解决方案

在当今企业运营中&#xff0c;设备管理作为保障生产稳定、提升效率的重要环节&#xff0c;其复杂性和挑战性日益凸显。无论是生产车间、石油化工、物业小区&#xff0c;还是消防器材、建筑施工等领域&#xff0c;都面临着设备故障频发、维修流程繁琐等共性问题。 为了帮助企业…

Python微磁学磁倾斜和西塔规则算法

&#x1f4dc;有限差分-用例 &#x1f4dc;离散化偏微分方程求解器和模型定型 | &#x1f4dc;三维热传递偏微分方程解 | &#x1f4dc;特定资产期权价值偏微分方程计算 | &#x1f4dc;三维波偏微分方程空间导数计算 | &#x1f4dc;应力-速度公式一阶声波方程模拟二维地震波…

PostgreSQL源码分析——缓冲区管理器

这里我们分析一下PG数据库缓冲区的代码。缓冲区是十分重要的&#xff0c;对数据库的性能和稳定性有着直接的影响。缓冲区是数据库SQL计算层与外部存储&#xff08;磁盘&#xff09;交互的关键。数据页的落盘与读取&#xff0c;都要经过缓冲区。 README src/backend/storage/…

为什么网络安全缺口很大,而招聘却很少?

2020年我国网络空间安全人才数量缺口超过了140万&#xff0c;就业人数却只有10多万&#xff0c;缺口高达了93%。这里就有人会问了&#xff1a; 1、网络安全行业为什么这么缺人&#xff1f; 2、明明人才那么稀缺&#xff0c;为什么招聘时招安全的人员却没有那么多呢&#xff1…

xcode报错合集,你都遇到过哪些跳不过的坑

1.报错Consecutive declarations on a line must be separated by ; 其实我这里是用因为创建了一个结构体&#xff0c;然后在没有使用State的情况下&#xff0c;修改它的属性了 当然加上State依然报错&#xff1a; 应该在UI事件中修改&#xff1a;

标准启动 | 畜禽养殖废水生物处理技术规范(拟))

近年来&#xff0c;由于养殖业的快速发展使得养殖污染成为农业污染的主要来源&#xff0c;养殖场污水的处理成为畜禽养殖业健康、可持续发展的主要因素。但是&#xff0c;研究表明&#xff0c;我国畜禽养殖规模仍继续增加&#xff0c;养殖总量以每年8%的趋势增长。2015年畜禽养…

SpringSecurity-入门代码

创建SpringBoot项目 参考文章&#xff1a; 【环境搭建】使用IDEA创建SpringBoot项目详细步骤_idea创建spring boot项目-CSDN博客 编写helloworld代码 RestController public class HelloController {GetMapping("/hello")public String hello(){return "hel…

对比4090及4090D:国区“特供”与原版相比有何区别?

2023年12月28日 英伟达宣布正式发布GeForce RTX 4090D&#xff0c;对比于一年前上市的4090芯片&#xff0c;两者的区别与差异在哪&#xff1f;而在当前比较火热的大模型推理、AI绘画场景方面 两者各自的表现又如何呢&#xff1f; 规格与参数信息对比现在先来看看GeForce RT…

Java SE入门及基础(56) 包装类

目录 1. 什么是包装类 2. 自动装箱和拆箱 自动装箱 自动装箱方法 示例 自动拆箱 自动拆箱方法 示例 3.字符串转数字的方法 示例 1. 什么是包装类 There are, however, reasons to use objects in place of primitives, and the Java platform provides wrapper classes for ea…

怎么用python将文件夹中的文件一键重命名

怎么用python将文件夹中的文件一键重命名 我有一个文件夹下全部是jpg和png的图片&#xff0c;但是名字参差不齐&#xff0c;我想用python将他们的名字有规律。 代码如下&#xff1a; import os import globdef rename_images(folder_path, new_name_prefix):# 获取文件夹中的…

终极版本的Typora上传到博客园和csdn

激活插件 下载网址是这个&#xff1a; https://codeload.github.com/obgnail/typora_plugin/zip/refs/tags/1.9.4 解压之后这样的&#xff1a; 解压之后将plugin&#xff0c;复制到自己的安装目录下的resources 点击安装即可&#xff1a; 更改配置文件 "dependencies&q…

24年新版!这份Excel+Python飞速搞定数据分析手册,简直可以让Excel飞起来

前⾔ 微软在 UserVoice 上运营着⼀个反馈论坛&#xff0c;每个⼈都可以在这⾥提交新点⼦供他⼈投票。票数最⾼的功能请求是“将 Python 作为Excel 的⼀门脚本语⾔”&#xff0c;其得票数差不多是第⼆名的两倍。尽管⾃2015 年这个点⼦发布以来并没有什么实质性进展&#xff0c;…

软件产品进行确认测试有什么好处?第三方软件测试机构分享

软件确认测试是一项旨在验证软件是否符合预期需求和规格的测试活动。通过确认测试&#xff0c;您可以确保软件的功能、性能和用户界面的符合程度&#xff0c;从而降低软件发布后出现问题的风险。 一、软件产品进行确认测试的好处   1、减少软件发布后修复问题的成本。通过及…

Postman如何在本地测试服务接口

项目架构及背景&#xff1a; 网关微服务多个业务微服务 服务部署在阿里云上&#xff0c;文件服务器用的是OSS。配置参数用Nacos进行统一管理。通过构建docker镜像包部署各业务微服务以及网关服务。 需求&#xff1a; 某一个业务微服务中开发了若干接口&#xff0c;需要在本地…

场外个股期权通道业务是什么意思?

今天带你了解场外个股期权通道业务是什么意思&#xff1f;场外个股期权业务是指在沪深交易所之外进行的个股期权交易。它是一种非标准化的合约&#xff0c;不在交易所内进行交割。 场外个股期权通道业务&#xff0c;是指投资者通过与场外个股期权机构通道签订合约&#xff0c;购…

初识形式化验证工具——CPN tools

安装链接&#xff1a;https://cpntools.org/category/downloads/ 学习链接&#xff1a;https://cs.au.dk/cpnets/industrial-use 成功安装软件&#xff1a; 右键新建/打开项目&#xff1a; 导入项目&#xff1a; 交互工具&#xff1a; 仿真运行&#xff1a;也是拖拽出来后&am…

探索Web Components

title: 探索Web Components date: 2024/6/16 updated: 2024/6/16 author: cmdragon excerpt: 这篇文章介绍了Web Components技术&#xff0c;它允许开发者创建可复用、封装良好的自定义HTML元素&#xff0c;并直接在浏览器中运行&#xff0c;无需依赖外部库。通过组合HTML模…

CNAS软件测试报告全国通用吗?如何获取CNAS软件测试报告?

CNAS是中国合格评定国家认可委员会的英文缩写&#xff0c;是我国负责认可和监管合格评定机构的国家级组织。CNAS软件测试报告是经过CNAS认可的软件测试机构出具的报告&#xff0c;它详细记录了被测试软件的测试结果、缺陷情况以及整体质量评估。 企业和用户通过查看CNAS软件测…