Mybatis一对多/多对多查询时只查出了一条数据
问题描述:
如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据。
三个表,权限表(Permission),权限组表(PermissionGroup),权限组与权限的关系表(PermissionPermissionGroupKey)
实体类就不写上来了。
原出错映射文件:
<resultMap id="permissionGroupResultMap" type="cn.kx59.admin.entity.PermissionGroup" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="decipher" property="decipher" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<!-- 一个权限组 对应多个权限-->
<collection property="permissionArrayList" ofType="cn.kx59.admin.entity.Permission">
<id column="id" property="id" jdbcType="INTEGER" />
<result column="url" property="url" jdbcType="VARCHAR" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="explain" property="explain" jdbcType="VARCHAR" />
<result column="decipher" property="decipher" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
</collection>
</resultMap>
<!--查询所有的权限组以及权限组包含的权限-->
<select id="selectAllPermissionGroupAndPermission" resultMap="permissionGroupResultMap" >
SELECT *
FROM [QPWebDB].[dbo].[permission_group] pg
left join [QPWebDB].[dbo].[permission_permission_group] ppg on pg.id=ppg.permission_group_id
left join [QPWebDB].[dbo].[permission] p on p.permission_id=ppg.permission_id
</select>
这是因为主表和明细表的id字段名相同造成的。
问题的关键在于resultMap中如果不定义类似主键之类的能够区分每一条结果集的字段的话,会引起后面一条数据覆盖前面一条数据的现象。
解决方法一:
修改主表或者明细表的id名,保证不一致就行
解决方法二:
查询结果起别名
修改映射文件如下:
<resultMap id="permissionGroupResultMap" type="cn.kx59.admin.entity.PermissionGroup" >
<id column="id" property="id" jdbcType="INTEGER" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="decipher" property="decipher" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
<!-- 一个权限组 对应多个权限-->
<collection property="permissionArrayList" ofType="cn.kx59.admin.entity.Permission">
<id column="p_id" property="id" jdbcType="INTEGER" />
<result column="url" property="url" jdbcType="VARCHAR" />
<result column="name" property="name" jdbcType="VARCHAR" />
<result column="explain" property="explain" jdbcType="VARCHAR" />
<result column="decipher" property="decipher" jdbcType="VARCHAR" />
<result column="create_time" property="createTime" jdbcType="TIMESTAMP" />
</collection>
</resultMap>
<!--查询所有的权限组以及权限组包含的权限-->
<select id="selectAllPermissionGroupAndPermission" resultMap="permissionGroupResultMap" >
SELECT pg.*,
p.id p_id,
p.url,
p.name,
p.explain,
p.decipher,
p.create_time
FROM [QPWebDB].[dbo].[permission_group] pg
left join [QPWebDB].[dbo].[permission_permission_group] ppg on pg.id=ppg.permission_group_id
left join [QPWebDB].[dbo].[permission] p on p.id=ppg.permission_id
</select>
如上两种方法均能解决这个问题,希望对你有帮助
有知道出现这个问题的原理的大佬欢迎在评论区解释下,O(∩_∩)O谢谢
本文章由[谙忆]编写, 所有权利保留。
欢迎转载,分享是进步的源泉。
转载请注明出处:http://chenhaoxiang.cn
本文源自【人生之旅_谙忆的博客】
Mybatis一对多/多对多查询时只查出了一条数据的更多相关文章
- Mybatis 级联查询时只查出了一条数据
造成这个问题的原因是: 主表和明细表的id字段名相同造成的. 问题的关键在于resultMap中如果不定义类似主键之类的能够区分每一条结果集的字段的话,会引起后面一条数据覆盖前面一条数据的现象.
- Mybatis使用MySQL进行模糊查询时输入中文检索不到结果
Mybatis使用MySQL进行模糊查询时输入中文检索时,需要在jdbcURL后增加参数 ?useUnicode=true&characterEncoding=UTF-8
- mybatis一对多查询resultMap只返回了一条记录
问题描述:因为领导的一个需求,需要用到使用resultMap,很久没使用了,结果就除了点意外.就记录下这个问题 准备两个类:author(作者)和book(书),数据库创建对应的author-> ...
- mybatis由浅入深day02_4多对多查询_多对多查询总结
4 多对多查询 4.1 需求(查询用户及用户购买商品信息) 查询用户及用户购买商品信息. 4.2 sql语句 查询主表是:用户表 关联表:由于用户和商品没有直接关联,通过订单和订单明细进行关联,所以关 ...
- mybatis一对多根据条件查询的查条数
一对多写了mapper映射之后 根据条件查条数 可以根据主表的唯一id进行分组 在拿到它的count select count(0) over(aa.id),,id,name,age from tab ...
- mysql同时使用order by和limit查询时的一个严重隐患 -- 丢失数据
转自: https://blog.csdn.net/tsxw24/article/details/44994835 我经常使用order by和limit来做数据分页显示并排序,一直也没发现过什么问题 ...
- Oracle触发器修改数据时同步执行插入该条数据
原创:lixx ---从UNWIREDATA 表中查询数据,如果该表中地磁状态发生改变(CARDSTATE)执行插入到MAINTABLE 表中---根据唯一值ERID判断,如果ERID值存在,修改该条 ...
- 方法:查询MongoDB数据库中最新一条数据(JAVA)
使用JAVA语言查询MongoDB中某个数据库某个集合的最新一条数据: MongoCollection<Document> cpu = MongoClient.getDatabase(&q ...
- MySQL分组查询每组最新的一条数据(通俗易懂)
开发中经常会遇到,分组查询最新数据的问题,比如下面这张表(查询每个地址最新的一条记录): sql如下: -- ---------------------------- -- Table structu ...
随机推荐
- Hbuilder MUI 注册短信验证60秒后重新发送
<div class="mui-input-row"> <label class="iconfont_log_reg icon-youjian" ...
- 【转】windows下python开发环境搭建
1 -- 安装python的前期准备 Python开发有众多工具,又以Eclipse+Pydev最为常见.Eclipse平台对开发同学来讲,肯定是如雷贯耳,自不用废话.而PyDev是Eclipse平台 ...
- JAVA学习第六十三课 — 关于client服务端 && URL类 & URLConnection
常见的client和服务端 client: 浏览器:IE:弹窗体,猎豹:弹窗体.多标签,争强效果 服务端: server:TomCat:1.处理请求 2.给予应答 想让TomC ...
- Android无线测试之—UiAutomator UiDevice API介绍三
获取坐标与坐标点击 一.坐标相关的知识: 1)手机屏幕坐标:左上角开始到右下角结束 2)DP:设备独立像素,例如320像素显示到640像素上要拉伸一倍 3)Point:代表一个点(x,y),左上角的坐 ...
- docker学习笔记(1)概述、原理学习、常用命令
一.Docker概述 Docker是基于Go语言实现的云开源项目,诞生于2013年初,目前主流的Linux操作系统已支持Docker,如Redhat RHEL6.5/CentOS6.5.Ubuntu ...
- Android打印日志管理
做项目的时候,免不了要打印许多日志,等项目上线了,想要去除日志是又找不到在哪里怎么办?我们可以建立一个日志打印的类来统一管理: public class LogUtil { public static ...
- 1686 第K大区间(尺取+二分)
1686 第K大区间 基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题 定义一个区间的值为其众数出现的次数.现给出n个数,求将所有区间的值排序后,第K大的值为多少. ...
- 关于微信小程序的开发步骤
~~~~包子最近在研究小程序 首先先讲一下小程序一些基本的步骤: 1.登录微信的公众平台,选择小程序,注册一个账号,期间有碰到什么交300块钱的就不要理他,因为我只是做demo,当然,准备上线的企业啥 ...
- Spec Explorer 工具学习
基础概念:http://blogs.msdn.com/b/sechina/archive/2009/12/28/test.aspx 在线教程:http://blogs.msdn.com/b/sechi ...
- javascript实例:显示时间
<!doctype html> <html lang="en"> <head> <meta charset="UTF-8&quo ...