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 需求: ======================================= ...
随机推荐
- 11.Java连接Redis_Jedis_测试联通
使用Java开发项目的时候使用Redis的话,目前有一些开源API可以使用. 最常用的就是jedis,它提供了许多基于Java的对象和方法来调用Redis的指令. jedis的jar包下载地址http ...
- Java学习之路【第一篇】:前言
Java 语言概述 一.什么是Java语言 Java语言是美国Sun公司(Stanford University Network),在1995年推出的高级的编程语言.所谓编程语言,是计算机的语言,人们 ...
- [Unity2d系列教程] 003.Unity如何调用android的方法
Unity开发的时候很多时候我们需要用到底层的一些功能,比如摄像,录音,震动等等,我们在Unity的层面是无法完成的.那么我们考虑到Unity是否可以直接调用到android方面的方法,替我们去完成我 ...
- 删除节点与插入节点 & innerHTML
1.测试removeChild()方法: 删除节点dom9.html <!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01//EN" &q ...
- 值得注意的Java基础知识
1)Java语言中默认(即缺省没写出)的访问权限,不同包中的子类不能访问. 中有4中访问修饰符:friendly(默认).private.public和protected. public :能被所有的 ...
- 关于vue的多页面标签功能,对于嵌套router-view缓存的最终无奈解决方法
最近写我自己的后台开发框架,要弄一个多页面标签功能,之前有试过vue-element-admin的多页面,以为很完美,就按它的思路重新写了一个,但发现还是有问题的. vue-element-admin ...
- SpringBoot—单元测试模板(controller层和service层)
介绍 概述 在开发过程中,我们经常会一股脑的写各种业务逻辑,经常等全部大功告成的时候,打个jar包放环境里跑跑看看能不能通,殊不知在各个业务方法中已经漏洞百出,修复一个打一个包,再继续修复,这种效 ...
- rewrite和return的简单需求
Rewrite 需求作业 背景:现在我有一个网站,www.linux.com www.linux.com访问主页面 friend.linux.com访问交友页面 blog.linux.com访问博客页 ...
- Java实现 蓝桥杯VIP 算法训练 JAM计数法
题目描述 Jam是个喜欢标新立异的科学怪人.他不使用阿拉伯数字计数,而是使用小 写英文字母计数,他觉得这样做,会使世界更加丰富多彩.在他的计数法中,每个数字的位数都是相同的(使用相同个数的字母),英文 ...
- Java实现 LeetCode 331 验证二叉树的前序序列化
331. 验证二叉树的前序序列化 序列化二叉树的一种方法是使用前序遍历.当我们遇到一个非空节点时,我们可以记录下这个节点的值.如果它是一个空节点,我们可以使用一个标记值记录,例如 #. _9_ / \ ...