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

原创 陈 浩翔  2017-08-24 01:32  阅读 7 次 评论 0 条

三个表,权限表(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谢谢

anyShare分享到:
本文地址:http://chenhaoxiang.cn/2017/08/24/0132/
关注我们:请关注一下我们的微信公众号:扫描二维码陈浩翔的公众号,公众号:Uifuture
版权声明:本文为原创文章,版权归 陈 浩翔 所有,欢迎分享本文,转载请保留出处!
PREVIOUS:已经是最后一篇了
NEXT:已经是最新一篇了

发表评论


表情