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查询中做到唯一即可