mybatis嵌套查询及在使用lombok下引发的问题记录

一、java.lang.IndexOutOfBoundsException: Index: 8, Size: 8错误

在查询用户信息的时候希望把用户的角色信息和角色对应的权限信息一并查询出来。

1.1、场景再现

查询语句的xml文件
在这里插入图片描述

 <resultMap id="userResultMap" type="UserInfo">
        <id property="id" column="id"  />
        <result property="name" column="name"  />
        <result property="username" column="username"  />
        <result property="password" column="password_hash"  />
        <!-- 将article list属性映射到collection -->
        <collection property="roles" ofType="AuthRoles" resultMap="roleResultMap"/>
    </resultMap>

    <resultMap id="roleResultMap" type="AuthRoles">
        <id property="id" column="id" />
        <result property="roleKey" column="role_key" />
        <collection property="permissions" ofType="AuthPermissions" resultMap="permissionsResultMap"/>
    </resultMap>

    <resultMap id="permissionsResultMap" type="AuthPermissions">
        <id property="id" column="id" />
        <result property="perms" column="perms"/>
    </resultMap>

    <select id="findUserByUsername" resultMap="userResultMap">
        SELECT u.id,u.`name`,u.username,u.password_hash,
               r.id,r.role_key,
               p.id,p.perms
        FROM auth_users u
                 LEFT JOIN auth_users_roles ur ON u.id = ur.user_id
                 LEFT JOIN auth_roles r ON ur.role_id = r.id
                 LEFT JOIN auth_role_permissions rp ON r.id = rp.role_id
                 LEFT JOIN auth_permissions p ON rp.permission_id = p.id
        WHERE u.username = #{username}
    </select>

1.2、报错日志

在这里插入图片描述
在这里插入图片描述
从报错日志中可以看到是因为没有适合8个参数的构造方法导致的。

1.3、解决方案

为实体类增加无参和全参的构造函数注解
在这里插入图片描述

二、sql中有多个同名字段时,resultMap方式导致字段混淆的问题

2.1、问题现象

解决完问题一后,查询发现,permissions中应该是没查询到数据。但是在java端的返回对象中却可以看到有一条数据,而且数据的id为1。
在这里插入图片描述

在这里插入图片描述

2.2、问题原因

在这里插入图片描述

2.3、解决方案

修改同名的id字段,将字段名在一个sql查询中做到唯一即可
在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值