else if mybatis 嵌套_记录Mybatis多层嵌套查询遇到的一个坑

在使用Mybatis的高级查询功能进行多层嵌套查询时,遇到一个问题,即在查询用户信息、角色信息及权限信息时,权限数据无法正确获取。问题源于映射文件中columnPrefix属性的使用。当移除columnPrefix并使用完整别名进行映射后,查询结果恢复正常,成功获取到角色对应的权限集合。
摘要由CSDN通过智能技术生成

问题的起因是用到了Mybatis提供的高级查询功能 - 嵌套查询

功能描述:

查询一个用户的基本信息,数据结构组成如下,用户信息-角色信息-权限信息

一个用户拥有多个角色(1对多),一个角色拥有多个权限(1对多)

需要通过一条SQL查询出用户的基本信息还有角色信息以及权限信息

问题描述:

通过如下SQL以及映射无法查询到权限数据

@Alias("users")

public class Users implements Serializable {

private static final long serialVersionUID = 8281654523591594805L;

private int id;

private String userName;

private Date birthday;

private String sex;

private String address;

private String passWord;

List roleList;

--------

}

@Alias("role")

public class Role implements Serializable {

private static final long serialVersionUID = 1811686676584921517L;

private int id;

private String roleName;

private List privilegeList;

-----------

}

@Alias("privilege")

public class Privilege implements Serializable {

private static final long serialVersionUID = -5886204003263304093L;

private int id;

private String privilegeName;

------------

}

存在问题的映射

通过下面的映射关系无法查询出角色对应的权限集合,问题的原因就在映射结果集中使用了columnPrefix这个属性,该属性的作用是过滤别名前缀

注意:该属性在只有一层嵌套查询时是没问题的,但是多个嵌套查询就有问题了

SELECT

U.ID, U.USERNAME, U.BIRTHDAY, U.SEX, U.ADDRESS, U.PASSWORD,

R.ID role_rid, R.ROLE_NAME role_roleName,

P.ID p_pid, P.PRIVILEGE_NAME p_privilegeName

FROM

USERS U

LEFT JOIN USER_ROLE UR ON U.ID = UR.USER_ID

LEFT JOIN ROLE R ON UR.ROLE_ID = R.ID

LEFT JOIN ROLE_PRIVILEGE RP ON RP.ROLE_ID = R.ID

LEFT JOIN PRIVILEGE P ON P.ID = RP.PRIVILEGE_ID

WHERE

U.ID = #{uid}

修改后的SQL以及映射

注意映射中去掉了columnPrefix属性,使用完整的别名进行映射,这样就可以查询到角色对应的权限集合数据

SELECT

U.ID, U.USERNAME, U.BIRTHDAY, U.SEX, U.ADDRESS, U.PASSWORD,

R.ID rid, R.ROLE_NAME roleName,

P.ID pid, P.PRIVILEGE_NAME privilegeName

FROM

USERS U

LEFT JOIN USER_ROLE UR ON U.ID = UR.USER_ID

LEFT JOIN ROLE R ON UR.ROLE_ID = R.ID

LEFT JOIN ROLE_PRIVILEGE RP ON RP.ROLE_ID = R.ID

LEFT JOIN PRIVILEGE P ON P.ID = RP.PRIVILEGE_ID

WHERE

U.ID = #{uid}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值