public List<SysMenu> getByUserId(Long userId) { String nativeSql = "SELECT DISTINCT m.* FROM sys_menu m "; nativeSql +="LEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id "; nativeSql +="LEFT JOIN sys_role r ON r.role_id = rm.role_id "; nativeSql +="WHERE r.role_id IN (SELECT role_id FROM sys_user_role WHERE user_id=?) "; nativeSql +="AND m.TYPE = 0 ORDER BY m.order_num"; List<SysMenu> list = dynamicQuery.query(SysMenu.class,nativeSql,new Object[]{userId}); list.stream().forEach(menu->{ String subSql = "SELECT DISTINCT m.* FROM sys_menu m "; subSql +="LEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id "; subSql +="LEFT JOIN sys_role r ON r.role_id = rm.role_id "; subSql +="WHERE r.role_id IN (SELECT role_id FROM sys_user_role WHERE user_id=?) "; subSql +="AND m.parent_id = ? ORDER BY m.order_num"; List<SysMenu> subList = dynamicQuery.query(SysMenu.class,subSql,new Object[]{userId,menu.getMenuId()}); menu.setList(subList); }); return list; }
时间: 2023-06-26 19:08:44 浏览: 148
这段代码是一个通过用户ID获取菜单列表的方法。它使用了原生SQL语句,通过左连接查询sys_menu、sys_role_menu和sys_role表来获取与用户关联的菜单列表。其中,子查询通过parent_id字段来获取每个菜单的子菜单列表,并将其设置到父菜单的list属性中。最后,返回一个包含菜单列表的List<SysMenu>对象。
相关问题
解释一下这段代码public List<SysMenu> getByUserId(Long userId) { String nativeSql = "SELECT DISTINCT m.* FROM sys_menu m "; nativeSql +="LEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id "; nativeSql +="LEFT JOIN sys_role r ON r.role_id = rm.role_id "; nativeSql +="WHERE r.role_id IN (SELECT role_id FROM sys_user_role WHERE user_id=?) "; nativeSql +="AND m.TYPE = 0 ORDER BY m.order_num"; List<SysMenu> list = dynamicQuery.query(SysMenu.class,nativeSql,new Object[]{userId}); list.stream().forEach(menu->{ String subSql = "SELECT DISTINCT m.* FROM sys_menu m "; subSql +="LEFT JOIN sys_role_menu rm ON m.menu_id = rm.menu_id "; subSql +="LEFT JOIN sys_role r ON r.role_id = rm.role_id "; subSql +="WHERE r.role_id IN (SELECT role_id FROM sys_user_role WHERE user_id=?) "; subSql +="AND m.parent_id = ? ORDER BY m.order_num"; List<SysMenu> subList = dynamicQuery.query(SysMenu.class,subSql,new Object[]{userId,menu.getMenuId()}); menu.setList(subList); }); return list; }
这段代码是一个查询指定用户ID下的菜单列表,并且将每个菜单的子菜单也一并查询出来。具体流程如下:
1. 首先构造一个 SQL 查询语句,用于查询菜单列表。该语句中使用了 LEFT JOIN 连接了多个表,以便能够查询到菜单对应的角色和用户信息。
2. 执行查询语句,并将结果映射为 SysMenu 对象的列表。
3. 对于每个菜单对象,构造一个子查询语句,用于查询该菜单的子菜单列表。该语句与菜单列表的查询语句类似,只是增加了一个条件,即查询该菜单的子菜单。
4. 执行子查询语句,并将结果映射为 SysMenu 对象的列表。
5. 将子菜单列表设置到对应的菜单对象中。
6. 返回菜单列表。
总的来说,这段代码实现了一个较为复杂的查询操作,涉及到多个表的连接和嵌套查询,需要对 SQL 语句和对象映射有一定的了解。
java中全集List<SysMenu> menu, 其中SysMenu有menuId和父菜单parentId , 写一个方法查出 指定menuId下面的所有子菜单menuId
在Java中,如果你有一个`List<SysMenu>`类型的列表`menu`,其中每个`SysMenu`对象包含`menuId`和`parentId`字段,你可以编写一个方法来查找指定`menuId`下的所有子菜单。假设`SysMenu`类有一个表示是否为子菜单的布尔属性,如`isSubmenu`,你可以这样做:
```java
public List<Long> getDescendantMenuIds(List<SysMenu> menu, Long parentId) {
List<Long> descendantIds = new ArrayList<>();
for (SysMenu item : menu) {
if (item.getMenuId().equals(parentId) && item.isSubmenu) { // 如果找到匹配的父ID
descendantIds.add(item.getMenuId()); // 添加子菜单ID
descendantIds.addAll(getDescendantMenuIds(menu, item.getMenuId())); // 递归查找子菜单的子菜单
}
}
return descendantIds;
}
```
这个方法首先检查每个菜单项是否是目标父ID的子菜单,如果是,则将其ID添加到结果列表,并对它的子菜单进行递归搜索。递归会在遇到新的子菜单时继续调用自身,直到没有任何更多的子菜单为止。
阅读全文