这两天在整理原有系统接口时,遇到后端的人员-角色-菜单的权限接口没有进行连表的关联查询操作,前端拿数据非常不方便,现在将接口相关sql进行修改并让前端可以一次性拿到想要的数据

原有的单表简单sql:

     <select id="queryList" resultType="com.framework.entity.SysRoleEntity">
select * from sys_role order by role_id asc
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>

修改为嵌套list返回结果集的查询(关键点:使用resultMap中的collection标签):

注意将select中的resultType修改为resultMap

    <resultMap id="BaseResultMap" type="com.framework.entity.SysRoleEntity">
<id column="role_id" property="roleId" jdbcType="INTEGER"></id>
<result column="role_name" property="roleName" jdbcType="VARCHAR"></result>
<result column="remark" property="remark" jdbcType="VARCHAR"></result>
<result column="create_time" property="createTime" jdbcType="TIMESTAMP"></result>
<collection property="menuIdList" resultMap="menuIdListMap" />
</resultMap>
<resultMap id="menuIdListMap" type="java.lang.Long">
<id column="menu_id" property="id" javaType="Long"></id>
</resultMap>
<select id="queryList" resultMap="BaseResultMap">
select
r.role_id,
r.role_name,
r.remark,
r.create_time,
rm.menu_id
from sys_role r
left join sys_role_menu rm on r.role_id=rm.role_id
order by r.role_id asc
<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>
</select>

现在这样子是已经达到返回结果集中嵌套list的效果

但是同时也带来另外一个问题:分页参数对应的是left join后的限制,并不是我们预期只对主表的分页限制,所以sql语句还需要进一步完善:

使用where条件,将分页参数当做一个查询子集,然后再利用 关键字IN 实现(由于IN关键字不可与limit在同一个语句使用,所以需要创建一个临时表)

sql最终结果:

     <select id="queryList" resultMap="BaseResultMap">
select
r.role_id,
r.role_name,
r.remark,
r.create_time,
rm.menu_id
from sys_role r
left join sys_role_menu rm on r.role_id=rm.role_id
<where>
<if test="offset != null and limit != null">
r.role_id IN (SELECT temp.role_id from (SELECT role_id FROM sys_role limit #{offset}, #{limit}) AS temp)
</if>
</where>
order by r.role_id asc
<!--<if test="offset != null and limit != null">
limit #{offset}, #{limit}
</if>-->
</select>

最终完成修改,发布测试,这里mark一下修改大致过程,希望能够帮助有需要的同学

MyBatis一对多嵌套list返回结果集以及分页查询问题处理的更多相关文章

  1. mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

    mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条

  2. MyBatis简单的增删改查以及简单的分页查询实现

    MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...

  3. MyBatis调用存储过程,含有返回结果集、return参数和output参数

    Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...

  4. 使用mybatis自动实现接口封装返回结果集

    import java.lang.annotation.Annotation; import java.lang.annotation.Documented; import java.lang.ann ...

  5. 存储过程不返回记录集导致ADO程序出错

    HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF( ...

  6. Mybatis + SpringMVC + Maven实现分页查询

    使用Mybatis + Maven + SpringMVC 运行时,突然被需要分页查询的功能给难住了 这里推荐采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Ora ...

  7. SpringBoot整合Mybatis关于分页查询的方法

    最近公司在用到SpringBoot整合Mybatis时当web端页面数据增多时需要使用分页查询以方便来展示数据.本人对分页查询进行了一些步骤的总结,希望能够帮助到有需要的博友.如有更好的方式,也希望评 ...

  8. mybatis一对一 和 一对多 嵌套查询

    实际项目中的,接口对外VO  会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋  ,楼栋 下面有 房屋    ,   房屋里面又房间 小区Vo  : districtVo { id: nam ...

  9. 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询

    mybatis实现 主从表 left join  1:n 一对多 分页查询   主表从表都有查询条件+count 需求: ======================================= ...

随机推荐

  1. Linux服务器程序--大数据量高并发系统设计

         在Linux服务器程序中,让系统能够提供以更少的资源提供更多的并发和响应效率决定了程序设计价值!怎样去实现这个目标,它其实是这么多年以来一直追逐的东西.最开始写代码时候,省去一个条件语句.用 ...

  2. 慕零的黑夜-头条-第二期(CSDN)[导读:] CSDN的15个bug&用户意见(很大) 作者:qq3461896724

    首先介绍CSDN: 相信"金山词霸,金山打字通"许多人都用过,而金山副总监 创办了  "全球最大中文IT技术平台,成就一亿技术人"的CSDN(Chinese s ...

  3. 设计Dog类 代码参考

    #include <iostream> #include <string> using namespace std; class Dog { private: string n ...

  4. jdk生成keystore、tomcat配置https

    一.首先利用jdk自带工具keytool生成keystore,命令如下:keytool -genkey -alias tomcat -keypass 123456 -keyalg RSA -keysi ...

  5. Binlog2sql+CentOS7 离线安装

    Binlog2sql+CentOS7 离线安装 目录 Binlog2sql+CentOS7 离线安装 1. 环境 2. 下载 3.1 Pip 安装 3.2 PyMySQL/mysql-replicat ...

  6. 以太坊智能合约开发框架Truffle

    前言 部署智能合约有多种方式,命令行的浏览器的渠道都有,但往往跟我们程序员的风格不太相符,因为我们习惯了在IDE里写了代码然后打包运行看效果. 虽然现在IDE中已经存在了Solidity插件,可以编写 ...

  7. Matlab矩阵学习二 矩阵的修改

    Matlab矩阵的修改 一.元素修改 (1).矩阵扩充   (2)矩阵删除某行或某列 删除某行:A(m,:)=[]   %删除A矩阵的第m行   删除某列: A(:,n)=[] %删除A矩阵的第n列 ...

  8. 13 . Python3之并发编程

    什么是操作系统? 为什么要有操作系统? 现代的计算机系统主要是由一个或者多个处理器,主存,硬盘,键盘,鼠标,显示器,打印机,网络接口及其他输入输出设备组成. 一般而言,现代计算机系统是一个复杂的系统. ...

  9. 【朝夕专刊】RabbitMQ消息的持久化优先级

    欢迎大家阅读<朝夕Net社区技术专刊> 我们致力于.NetCore的推广和落地,为更好的帮助大家学习,方便分享干货,特创此刊!很高兴你能成为忠实读者,文末福利不要错过哦! 上篇文章介绍了R ...

  10. Java Word中的文本、图片替换功能

    Word中的替换功能以查找指定文本然后替换为新的文本,可单个替换或全部替换.以下将要介绍的内容,除常见的以文本替换文本外,还将介绍使用不同对象进行替换的方法,具体可包括: 1. 指定字符串内容替换文本 ...