首页 > 其他分享 >MyBatis Plus 按指定顺序查询对象列表

MyBatis Plus 按指定顺序查询对象列表

时间:2024-04-25 10:33:05浏览次数:23  
标签:顺序 process id 列表 Plus 数组 SQL MyBatis processIdList

场景

定义了一个字段,存储了一个 json 数组比如:[41,38,42],它的含义是一个线性的流程定义,所以保证顺序至关重要

现在使用 MyBatis Plus 的 API 方法去通过 ID 数组查询得到对象数组

List<ProcessNodePO> processNodeList = processNodeMapper.selectList(new LambdaQueryWrapper<ProcessNodePO>()
        .in(ProcessNodePO::getProcessId, processIdList));

问题

原 ID 数组中的顺序为:41,38,42

查询得到的对象 ID 顺序为:38,41,42

顺序被改写,对象数组顺序与参数数组顺序不一致

这个问题的本质是 SQL 语句中的IN()造成的

目标

使得查询得到的对象数组顺序与原参数数组保持一致

解决方案

方案 1:MyBatis plus last()

last()用于在查询末尾添加自定义 SQL,但是代码和 SQL 语句混在一起观感不好、也不利于维护,而且通过字符串来拼接 SQL 也会存在 SQL 注入的风险

List<Integer> processIdList = Arrays.asList(41, 38, 42);

LambdaQueryWrapper<ProcessNodePO> queryWrapper = new LambdaQueryWrapper<>();
queryWrapper.in(ProcessNodePO::getProcessId, processIdList);

// 使用 FIELD 函数在 SQL 中指定排序顺序
String fieldOrder = processIdList.stream()
                                 .map(String::valueOf)
                                 .collect(Collectors.joining(","));
queryWrapper.last("ORDER BY FIELD(process_id, " + fieldOrder + ")");

List<ProcessNodePO> processNodeList = processNodeMapper.selectList(queryWrapper);

方案二:用 Java 代码对查询出的集合重新排序

这个方式也不好

List<ProcessNodePO> processNodeList = processNodeMapper.selectList(queryWrapper);

// 使用给定的顺序排序结果
Map<Integer, Integer> orderMap = new HashMap<>();
for (int i = 0; i < processIdList.size(); i++) {
    orderMap.put(processIdList.get(i), i);
}

// 按照 orderMap 排序
processNodeList.sort(Comparator.comparingInt(po -> orderMap.getOrDefault(po.getProcessId(), Integer.MAX_VALUE)));

方案三:用 MyBatis 动态 SQL

当然,这本质上和方案一没有区别,都是使用FIELD(),但是形式上好得多

<select id="queryListByDesignatedOrder" parameterType="java.lang.Integer"
        resultType="com.xingyun.warning.center.infrastructure.db.dataObject.helper.ProcessNodePO">
    SELECT process_id,process_desc,is_input_required as inputRequired,param_name,prompt,is_request_required as
    sendRequestRequired,component
    FROM t_operation_helper_process_node
    WHERE process_id IN
    <foreach item="id" collection="nodeIdList" open="(" separator="," close=")">
        #{id}
    </foreach>
    ORDER BY FIELD(
    process_id,
    <foreach item="id" collection="nodeIdList" separator=",">
        #{id}
    </foreach>
    )
</select>

标签:顺序,process,id,列表,Plus,数组,SQL,MyBatis,processIdList
From: https://www.cnblogs.com/yaocy/p/18157045

相关文章

  • Python函数参数为列表问题
    defADD(a):print(3,a,hex(id(a)))a.remove(2)print(3,a,hex(id(a)))a=a.append(10)print(3,a,hex(id(a)))returnaa=[1,2,3]print(1,a,hex(id(a)))b=ADD(a)print(2,a,hex(id(a)))print(2,b,hex(id(b)))函数传参的......
  • 使用 Python 循环创建多个列表
    前言在Python中,我们可以使用循环来动态创建多个列表,这在处理数据、进行数据分析或进行算法实现时非常有用。本文将介绍几种常见的方法,以帮助大家学习如何使用循环创建多个列表。方法一:使用列表推导式列表推导式是Python中一种简洁的语法,可以快速生成列表。我们可以结合循......
  • 最近5年133个Java面试问题列表
    来源:https://github.com/YHGui/easy-job/blob/master/面试题/133个Java常见面试题.mdJava面试随着时间的改变而改变。在过去的日子里,当你知道String和StringBuilder的区别(String类型和StringBuffer类型的主要性能区别其实在于String是不可变的对象。因此在每次对Stri......
  • 25-Mybatis源码分析
    1.架构设计&测试代码1.1Mybatis四层架构【API接口层】提供API增加、删除、修改、查询等接口,通过API接口对数据库进行操作;【数据处理层】主要负责SQL的查询、解析、执行以及结果映射的处理,主要作用解析SQL根据调用请求完成一次数据库操作;【框架支撑层】负责通用基......
  • Mybatis Plus使用QueryWrapper、EntityWrapper配置Or的查询方法
    QueryWrapper↓↓↓↓构建代码QueryWrapper<UserPharmacy>wrapper=newQueryWrapper<UserPharmacy>();           wrapper.eq("a.delType",0)                   .and(StrUtil.isNotBlank(userPharmacyQueryDTO.getName()),wrapper1->wrapp......
  • sqlplus 下 常用设置
    OS:RedHatEnterpriseLinuxServerrelease6.3(Santiago)DB:11.2.0.4.0设置行的宽度和页的行数SQL>setline233pages233显示sql执行的时间SQL>settimingonSQL>selectinstance_namefromv$instance;INSTANCE_NAME----------------PRDElapsed:00......
  • [Vue3+Element-Plus]点击列表中的图片预览时,图片被表格覆盖
    preview-teleported="true" <el-table-columnprop="id"label="ID"width="80"align="center"sortable/><el-table-columnlabel="商品图片"width="85px"><template#default=&q......
  • DedeBiz动态列表页设置超过10页就不显示,防止被全站采集的方法
    DedeBiz动态列表页设置超过10页就不显示,防止被全站采集的方法:我们的动态列表页list.php?tid=1&PageNo=28 这个分页的数量控制,设置只能显示10页后面的如果输入大于10就提示错误。找到apps/list.php,在里面添加判断代码文字提醒:if($PageNo>10){ShowMsg('对不起大于10......
  • dedebiz列表添加自增序号代码
    dedebiz列表添加序号代码如下://默认从1开始自增[field:globalname=autoindex/]但是有时候我们可能不需要从1开始,比如从2开始,那么就需要这样写://实现从2或者其他数字开始自增修改@me+1即可[field:globalname=autoindexrunphp="yes"]@me=@me+1;[/field:global]如果想让它......
  • 软件与系统工程领域国家标准列表
    截止2020年6月,软件与系统工程领域国家标准已发布122项,在研18项。一、基础 GB/T11457-2006信息技术软件工程术语 GB/T22033-2017信息技术嵌入式系统术语 GB/Z31102-2014软件工程软件工程知识体系指南 二、软件质量与测试 GB/T15532-2008计算机软件测试规范 GB/T1849......