【问题解决】Mybatis一对多/多对多查询时只查出了一条数据-阿里云开发者社区

开发者社区> 谙忆> 正文

【问题解决】Mybatis一对多/多对多查询时只查出了一条数据

简介: 问题描述: 如果三表(包括了关系表)级联查询,主表和明细表的主键都是id的话,明细表的多条数据只能查询出来第一条/最后一条数据。 三个表,权限表(Permission),权限组表(PermissionGroup),权限组与权限的关系表(PermissionPermissionGroupKey) 实体类就不写上来了。
+关注继续查看

问题描述:
如果三表(包括了关系表)级联查询,主表和明细表的主键都是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

本文源自人生之旅_谙忆的博客

版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。

相关文章
Oracle数据库死锁问题的查询与处理
Oracle数据库死锁问题的查询与处理 近来在工作中遇到了oracle数据库死锁问题,下面是转载的问题查询与处理方法,侵删。 一、数据库死锁的现象 程序在执行的过程中,点击确定或保存按钮,程序没有响应,也没有出现报错。
1952 0
MyBatis常见问题
Mybatis是一个类似于Hibernate的ORM持久层开源框架,
510 0
API浏览器数据查询失败问题的解决
由于API浏览器是针对VB而开发的,所以数据库采用的DAO,但是随着API浏览器的升级,不仅支持VB本身,也提供VB.net,C#API的查询,甚而是一些E文不太好的朋友,在开发VC程序时,也看一下API的中文说明。
441 0
Mybatis 级联查询 (一对多 )
后台系统中 涉及到添加试卷 问题 答案的一个模块的。我需要通过试卷 查询出所有的试题,以及试题的答案。这个主要要使用到Mybatis的级联查询。 通过试卷 查询出与该试卷相关的试题(一对多),查询出试题的答案及分数(一对多)。
970 0
关于Mybatis-plus中性能插件失效问题
有关PerformanceInterceptor这个sql性能分析插件的类失效问题
70 0
Mybatis Plus 2 升到 Mybatis Plus 3 时,oracle 自增序列的相关问题
一、Mybatis Plus 2,oracle 自增序列配置 1. config.yml 配置文件 #mybaits-plus配置,修改主键类型,mapper.xml、type 别名等 mybatis-plus: mapper-locations: classpath:/mapper/*Mapper.
5737 0
jpa @onetomany 级联查询时会有重复数据,去重问题
自己是直接查出来然后利用set去重(自己感觉不是太好,不过能达到目的) List list = query.getResultList();Set set=new HashSet(list);如有更好的方法,希望大佬留言,谢谢
1672 0
+关注
谙忆
GitHub: https://github.com/chenhaoxiang
714
文章
40
问答
文章排行榜
最热
最新
相关电子书
更多
《2021云上架构与运维峰会演讲合集》
立即下载
《零基础CSS入门教程》
立即下载
《零基础HTML入门教程》
立即下载