【问题解决】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

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

时间: 2024-09-28 21:56:45

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

MySqlDataReader查询时丢失表的首条数据,如何解决?

问题描述 usingSystem;usingSystem.Collections.Generic;usingSystem.ComponentModel;usingSystem.Data;usingSystem.Drawing;usingSystem.Text;usingSystem.Windows.Forms;usingMySql.Data.MySqlClient;namespaceMySqlDemo{publicpartialclassForm1:Form{publicForm1(){Init

hql语句只能查询出数据库里面的第一条数据

问题描述 hql语句只能查询出数据库里面的第一条数据 dao层 //查询所有的信息 public List<Stock> getAll() { String hql = ""FROM Stock s LEFT OUTER JOIN FETCH s.people""; return getSession().createQuery(hql).list(); } service层 public List<Stock> getAll() { ret

Contains模糊查询列,列中有一条数据为NULL,就报错

问题描述 Contains模糊查询列,列中有一条数据为NULL,就报错 Contains模糊查询列,列中有一条数据为NULL,就报错 list.Where(x => x.Contact_Phone.Contains(Request["phone"]) 三条数据,2条有phone,一条没有,报错,把另一条添加上就可以用

2005-如何在SQL数据表中如何剔除连续重复的记录,统计个数时只记做1条记录?

问题描述 如何在SQL数据表中如何剔除连续重复的记录,统计个数时只记做1条记录? 各位大虾帮帮忙:如何剔除数据表中连续重复的记录记做1条记录?? 数据表如下,我想要取result=0的sn在各prodorderid下的个数( 注意:要剔除连续重复的数据,记做1条记录,但是不连续的重复的分别记为1条记录 ) create table test ( id int identity(1,1) primary key, sn varchar(50) not null, prodorderid int n

用cookie做购物车的增删改查,cookie.Values 新增了键值对,为何在此取值时,就只有第一条数据了

问题描述 用cookie做购物车的增删改查,cookie.Values新增了键值对,为何在此取值时,就只有第一条数据了HttpCookiecookie=newHttpCookie("carcookie");//创建一个大的cookie对象cookie.Values.Add("商品ID1",Server.UrlEncode("商品信息列表1"));//往cookie中添加子键值对cookie.Expires=DateTime.Now.AddDays

如何写一个方法用SQL语句查询一张表中有多少条数据,方法改怎么写?

问题描述 如何写一个方法用SQL语句查询一张表中有多少条数据,方法改怎么写? 将查询的的返回值为整型 参考用例 类似 以下方法查询政治类新闻人数 新手不知道该如何改动成自己需要的方法 public Map<String, Long> sumPolEntNews(){ //查询政治类新闻人数总和 String sql = "select count(*) from t_user where newsh ='政治类新闻' "; Map<String, Long> m

mysql 查询慢-mysql 近5万条数据的表 使用联表查询 出现服务器CPU占用过多

问题描述 mysql 近5万条数据的表 使用联表查询 出现服务器CPU占用过多 mysql 近5万条数据的表 使用联表查询 出现服务器CPU占用过多,贴大神代码求优化指点!!!!!有两张表分别为:lu_yccdd 和 lu_taizhang使用的联表查询代码:SELECT distinct(t.sc_time) sc_timecount(distinct(y.id)) totalcount(distinct(t.cdd_id)) tjjg(count(distinct(y.id))-count(

Mybatis使用MySQL模糊查询时输入中文检索不到结果怎么办_java

项目开发中,在做Mybatis动态查询时,遇到了一个问题:MySQL在进行LIKE模糊查询时,输入英文可以正常检索出结果,但是输入中文后检索得到的结果为空. 由于是使用GET方式请求,所以为了确保中文不乱码,在控制台接收到请求参数后,对中文进行了一次编码. try { realName = new String(realName.getBytes("GBK"), "UTF-8"); } catch (UnsupportedEncodingException exce

resultmap-用mybaits的resultMap查询数据时,为什么只能返库的最后一条数据

问题描述 用mybaits的resultMap查询数据时,为什么只能返库的最后一条数据 select tb_item.* tb_item_pic.id as itemPic_id tb_item_pic.item_id tb_item_pic.url from tb_item tb_item_pic where tb_item.id=tb_item_pic.item_id and tb_item.id in open=""("" separator="&q