resultMap中的collection集合出现只能读取一条数据的解决方法

查询数据时只能获得collection集合中的的一条数据,相关情况如下:

 

结果集resultMap:

<resultMap id="ManagerRolesAcls" type="com.meikai.shop.entity.TSystemManager">
<id column="ID" jdbcType="BIGINT" property="id" />
<result column="create_date" jdbcType="TIMESTAMP" property="createDate" />
<result column="update_date" jdbcType="TIMESTAMP" property="updateDate" />
<result column="manager_name" jdbcType="VARCHAR" property="managerName" />
<result column="nickname" jdbcType="VARCHAR" property="nickname" />
<result column="password" jdbcType="VARCHAR" property="password" />
<result column="avatar" jdbcType="VARCHAR" property="avatar" />
<result column="is_enable" jdbcType="INTEGER" property="isEnable" />
<result column="is_locked" jdbcType="INTEGER" property="isLocked" />
<result column="try_num" jdbcType="INTEGER" property="tryNum" />
<result column="locked_date" jdbcType="TIMESTAMP" property="lockedDate" />
<result column="is_forver" jdbcType="INTEGER" property="isForver" />
<result column="login_time" jdbcType="TIMESTAMP" property="loginTime" />
<result column="login_ip" jdbcType="VARCHAR" property="loginIp" />
<result column="email" jdbcType="VARCHAR" property="email" />
<result column="active_code" jdbcType="VARCHAR" property="activeCode" />
<!-- 拥有角色集合 -->
<collection property="roles" ofType="com.meikai.shop.entity.TSystemRole" javaType="java.util.ArrayList">
<id column="ID" jdbcType="BIGINT" property="id" />
<result column="role_name" jdbcType="VARCHAR" property="roleName" />
<!-- 拥有资源集合 -->
<collection property="acls" ofType="com.meikai.shop.entity.TSystemAcl" javaType="java.util.ArrayList">
<id column="ID" jdbcType="BIGINT" property="id" />
<result column="permission" jdbcType="VARCHAR" property="permission" />
</collection>
</collection> 
</resultMap>

 

5表关联查询:

<!-- 根据用户ID获得用户及其角色和资源 -->
<select id="getRolesAndAclsByID" parameterType="Long" resultMap="ManagerRolesAcls">
SELECT m.*,r.ID,r.role_name,a.ID,a.permission
FROM t_system_manager m 
LEFT JOIN 
t_system_manager_role mr ON m.ID=mr.manager_id 
LEFT JOIN t_system_role r ON mr.`role_id`=r.`ID` 
LEFT JOIN t_system_role_acl ra ON r.`ID`=ra.`role_id` 
LEFT JOIN t_system_acl a ON a.`ID`=ra.`acl_id` 
WHERE m.ID=#{id,jdbcType=BIGINT}; 
</select>

 

根据ID获得管理员:


@RequestMapping(value= {"view"},method = { RequestMethod.GET })
@ResponseBody
public TSystemManager view(HttpServletRequest request,Long id) {

TSystemManager viewManager = managerService.getRolesAndAclsByID(id);

    for(TSystemRole role : viewManager.getRoles()) {
           System.out.append("拥有的角色是:"+role.getRoleName());

                for(TSystemAcl acl : role.getAcls()) {
                     System.out.append("拥有的资源是:"+acl.getPermission());
                }
    }
   return viewManager;
}

 

在mysql通过上述5表查询语句能查询多条关于角色和资源的记录,但是通过mybatis查询获得的只有单条角色和资源的数据。

在sqlyog的查询结果

 

 

 

通过mybatis获得的结果

 

 

排查许久发现原因是:

1、主表的id字段和从表的id字段一样;

2、collection集合中包含<id column="ID" jdbcType="BIGINT" property="id" />;

 

如果同时存在上面两种情况,就只能获得collection的一条数据。

 

解决方法:

去掉collection的<id column="ID" jdbcType="BIGINT" property="id" />后,才能查询出全部数据。

 

转载于:https://www.cnblogs.com/kenhome/p/7647132.html

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
### 回答1: resultmapcollection是用于映射一对多关系的元素,它可以将一个查询结果集的多条记录映射成一个Java对象的一个集合属性。在resultmapcollection元素需要指定一个property属性,用于指定Java对象集合属性名,同时需要指定一个子元素result,用于指定集合元素的映射规则。通常情况下,collection元素会和association或者resultmap元素一起使用,用于实现复杂的对象关系映射。 ### 回答2: resultmapcollection元素是MyBatis框架的一个功能强大的标签,它可以用来处理对象之间的一对多或多对多关系。 在MyBatis,如果一个查询语句需要返回多个对象,且这些对象之间存在一对多或多对多的关系,那么我们可以使用resultmapcollection元素来进行映射。 在resultmap定义collection标签时,我们需要指定一个唯一的属性名来作为集合对象的名字,并指定该集合对象所需要映射的结果集数据。 使用collection标签时,我们还需要通过select子标签来指定要执行的查询语句,且该查询语句返回的结果集需要与集合对象的元素类型一致。 在数据库查询时,MyBatis会先根据主查询语句获取到一条主记录,并将主记录的某个字段作为参数传递给关联的查询语句。然后,MyBatis会执行关联的查询语句,并将返回的结果集封装成一个集合对象,并将这个集合对象设置到主记录对象。 通过使用collection标签,我们可以很方便地实现对象之间的关联查询,并将查询结果以集合的方式存储在某个对象,从而实现一对多或多对多关系的处理。 总而言之,resultmapcollection元素为我们提供了一种灵活而强大的方式来处理对象之间的一对多或多对多关系,帮助我们在业务开发更好地进行对象的关联查询和数据映射。 ### 回答3: ResultMapcollection 元素用于处理一对多的关系映射。在一对多的关系,通常一个主对象关联多个从对象,而 collection 元素可以帮助我们将这些从对象映射到主对象。 首先,我们需要在 ResultMap 定义一个 collection 元素。这个元素包含以下几个重要属性: 1. property:指定主对象用于存储从对象集合的属性名。 2. ofType:指定从对象集合的类型。 3. select:指定查询从对象集合的 SQL 语句。 接着,在 SQL 映射文件,我们需要编写查询从对象集合的 SQL 语句,并在这个 SQL 语句使用主对象的属性作为参数。在执行查询后,从对象集合的结果会被映射到主对象的属性上。 最后,在使用这个 ResultMap 的时候,我们可以直接通过主对象的属性来获取从对象集合。MyBatis 会根据 ResultMap 的定义自动完成对象的映射。 collection 元素的使用可以极大地简化一对多关系的处理。我们不再需要手动写查询从对象集合的 SQL 语句,也不需要手动进行结果集的映射。MyBatis 会自动完成这些操作,并且保证了每个主对象和从对象集合之间的关联。 总之,ResultMap collection 元素是为了处理一对多关系而设计的,它能帮助我们将从对象集合映射到主对象,简化了一对多关系的处理过,提高了开发的效率和系统的可维护性。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值