MyBatis一对多嵌套list返回结果集以及分页查询问题处理
这两天在整理原有系统接口时,遇到后端的人员-角色-菜单的权限接口没有进行连表的关联查询操作,前端拿数据非常不方便,现在将接口相关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返回结果集以及分页查询问题处理的更多相关文章
- mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
mybatis 一对多的注入 指的是连表查询时候 将不同的查询结果以列表存储对象形式 注入进去 多对一指的是 查询多条结果但都是一样的 只需注入一条
- MyBatis简单的增删改查以及简单的分页查询实现
MyBatis简单的增删改查以及简单的分页查询实现 <? xml version="1.0" encoding="UTF-8"? > <!DO ...
- MyBatis调用存储过程,含有返回结果集、return参数和output参数
Ibatis是我们经常使用的O/R映射框架,mybats是ibatis被Google收购后重新命名的一个工程,当然也做了大量的升级.而调用存储过程也是一次额C/S架构模式下经常使用的手段,我们知道,i ...
- 使用mybatis自动实现接口封装返回结果集
import java.lang.annotation.Annotation; import java.lang.annotation.Documented; import java.lang.ann ...
- 存储过程不返回记录集导致ADO程序出错
HRESULT _hr = get_adoEOF(&_result); IsEOF()函数如下:其中ADOCG::_RecordsetPtr m_pRecordset; BOOL IsEOF( ...
- Mybatis + SpringMVC + Maven实现分页查询
使用Mybatis + Maven + SpringMVC 运行时,突然被需要分页查询的功能给难住了 这里推荐采用的插件是PageHelper这个插件,使用起来十分方便.该插件支持以下数据库: Ora ...
- SpringBoot整合Mybatis关于分页查询的方法
最近公司在用到SpringBoot整合Mybatis时当web端页面数据增多时需要使用分页查询以方便来展示数据.本人对分页查询进行了一些步骤的总结,希望能够帮助到有需要的博友.如有更好的方式,也希望评 ...
- mybatis一对一 和 一对多 嵌套查询
实际项目中的,接口对外VO 会出现 一对一 和 一对多的情况,举例:小区 下面有 楼栋 ,楼栋 下面有 房屋 , 房屋里面又房间 小区Vo : districtVo { id: nam ...
- 【mysql】 mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件 【mybatis】count 统计+JSON查询
mybatis实现 主从表 left join 1:n 一对多 分页查询 主表从表都有查询条件+count 需求: ======================================= ...
随机推荐
- [安卓基础] 005.创建一个简单的UI
*:first-child { margin-top: 0 !important; } body > *:last-child { margin-bottom: 0 !important; } ...
- 百万年薪架构师一文整理RabbitMQ、ActiveMQ、RocketMQ、Kafka
一般来说,大型应用通常会被拆分成多个子系统,这些子系统可能会部署在多台机器上,也可能只是一台机器的多个进程中,这样的应用就是分布式应用.在讨论分布式应用时,很多初学者会把它和集群这个概念搞混,因为从部 ...
- 02 . Mysql基础操作及增删改查
SQL简介 SQL(Structured Query Language 即结构化查询语言) SQL语言主要用于存取数据.查询数据.更新数据和管理关系数据库系统,SQL语言由IBM开发. SQL语句四大 ...
- 【项目】关于TeenCode第二代评测机的技术分析
晚上睡不着觉,仔细研读了洛谷的第四代评测机技术分析后,突然发现自己写的TeenCode评测机竟然有这么多地方可以改进,这不得不让我诞生了实现第二代TeenCode评测机的想法.[第一代评测机挺可怜的, ...
- Java实现 LeetCode 695 岛屿的最大面积(DFS)
695. 岛屿的最大面积 给定一个包含了一些 0 和 1 的非空二维数组 grid . 一个 岛屿 是由一些相邻的 1 (代表土地) 构成的组合,这里的「相邻」要求两个 1 必须在水平或者竖直方向上相 ...
- Java实现 蓝桥杯VIP 算法训练 大小写判断
问题描述 给定一个英文字母判断这个字母是大写还是小写. 输入格式 输入只包含一个英文字母c. 输出格式 如果c是大写字母,输出"upper",否则输出"lower&quo ...
- Java实现 LeetCode 301 删除无效的括号
301. 删除无效的括号 删除最小数量的无效括号,使得输入的字符串有效,返回所有可能的结果. 说明: 输入可能包含了除 ( 和 ) 以外的字符. 示例 1: 输入: "()())()&quo ...
- Java实现 LeetCode 207 课程表
207. 课程表 现在你总共有 n 门课需要选,记为 0 到 n-1. 在选修某些课程之前需要一些先修课程. 例如,想要学习课程 0 ,你需要先完成课程 1 ,我们用一个匹配来表示他们: [0,1] ...
- Android中如何使用Listview
第一步 首先在xml文件中声明一个List View控件,并且标明id (这一步其实不用说,怕自学Android的小白不懂,就好比当初的我,哈哈) <?xml version="1.0 ...
- java实现第七届蓝桥杯打靶
打靶 题目描述 小明参加X星球的打靶比赛. 比赛使用电子感应计分系统.其中有一局,小明得了96分. 这局小明共打了6发子弹,没有脱靶. 但望远镜看过去,只有3个弹孔. 显然,有些子弹准确地穿过了前边的 ...