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 ...
随机推荐
- PyTorch在64位Windows下的Conda包(转载)
PyTorch在64位Windows下的Conda包 昨天发了一篇PyTorch在64位Windows下的编译过程的文章,有朋友觉得能不能发个包,这样就不用折腾了.于是,这个包就诞生了.感谢@晴天14 ...
- 【Mac + Python3.6 + ATX基于facebook-wda】之IOS自动化(一):WebDriverAgent安装
此篇介绍如何安装WebDriverAgent,下一篇介绍facebook-wda库的安装使用以及自动化脚本的开发. 前言: 对于iOS的应用的测试,如果不需要用到图像识别,推荐使用这个项目facebo ...
- 【转】支付宝WAP支付接口开发
支付宝WAP支付接口开发 因项目需要,要增加支付宝手机网站支付功能,找了支付宝的样例代码和接口说明,折腾两天搞定,谨以此文作为这两天摸索的总结.由于公司有自己的支付接口,并不直接使用这个接口,所以晚些 ...
- DeepLearnToolbox-master代码学习笔记
卷积神经网络(CNN)博大精深,网上资料浩如烟海,让初学者无从下手.笔者以为,学习编程还是从代码实例入们最好.目前,学习CNN最好的代码实例就是,DeepLearnToolbox-master,不用装 ...
- genymotion启动报错
启动genymotion时提示 网络配置有问题,经检查是网卡virtualBox配置的问题,把ip设为自动获取即可 重新启动就可以了
- hadoop之WordCount源代码分析
//近期在研究hadoop.第一个想要要開始研究的必然是wordcount程序了.看了<hadoop应用开发实战解说>结合自己的理解,对wordcount的源代码进行分析. <pre ...
- ios -过滤字符串特殊字符
//过滤 " [ ] " + (NSString *)onTwoCommseparatedWithString:(NSString *)string { //过滤 " [ ...
- python3 - 动态添加属性以及方法
给实例动态添加方法,需引入types模块,用其的MethodType(要绑定的方法名,实例对象)来进行绑定:给类绑定属性和方法,可以通过 实例名.方法名(属性名) = 方法名(属性值) 来进行绑定.给 ...
- ADODB
转自网友,看着挺全就转了,供大家学习研究. Recordset 对象的属性1.CursorType 属性AdOpenForwardOnly: 仅向前游标,默认值.除了只能在记录中向前滚动外,与静态游标 ...
- RabbitMQ安装篇
一切不是自己实战,且跑不起来的程序都是在耍流氓! 先下载: http://www.erlang.org/downloads erlang 包