需求:getAllMenusWithRole 获取所有菜单访问所需要的角色。
菜单和角色是多对多关系,有一个关联表,菜单去重,角色返回集合
public class MenuVO extends SysMenu {
private List<SysRole> roles;
}
实现一
@Select("select rm.menu_id,m.`name`,m.url from sys_role_menu as rm LEFT JOIN sys_menu as m on rm.menu_id = m.menu_id GROUP BY rm.menu_id")
@Results({
@Result(column="menu_id",property="menuId"),
@Result(column="menu_id",property="roles",
many=@Many(
select="com.XXX.mapper.SysRoleMapper.selectSysRoleByMenuId"
)
)
})
List<MenuVO> getAllMenusWithRole();
@Select("select * from sys_role as r where r.role_id in (select rm.role_id from sys_role_menu as rm where rm.menu_id = #{menuid})")
List<SysRole> selectSysRoleByMenuId(@Param("menuid") Integer menuid);
标注方式,查询关联,缺点多次查库,@Results标注内,试过没有相关集合标注。其实也可用实现二中的sql,查询出来,自己在service层处理,搞成List
实现二
<!-- 通用查询映射结果 -->
<resultMap id="BaseResultMap" type="com.XXX.entity.SysMenu">
<id column="menu_id" property="menuId"/>
<result column="name" property="name"/>
<result column="url" property="url"/>
</resultMap>
<resultMap id="MenuWithRole" type="com.XXX.entity.MenuVO" extends="BaseResultMap">
<collection property="roles" ofType="com.XXX.entity.SysRole">
<id column="role_id" property="roleId"/>
<result column="role_name" property="roleName"/>
<result column="role_name_zh" property="roleNameZh"/>
</collection>
</resultMap>
<select id="getAllMenusWithRole" resultMap="MenuWithRole">
select
m.*,r.role_id,r.role_name,r.role_name_zh
from
sys_menu m,sys_role_menu mr,sys_role r
where
m.menu_id=mr.menu_id and mr.role_id=r.role_id
order by
m.menu_id desc
</select>
xml方式,用mybatis-plus能不用就不用xml文件,所以,是在标注没法实现,优点:查询一次