我有一个菜单系统,其中 MenuTabs - 顶层,它们包含菜单,菜单包含 MenuItem 。
每个关卡项都有一个用户角色列表,应该可以看到。
我需要创建一个数据库查询来选择MenuTabs,它只包含当前用户可见的MenuItem的可见菜单。有没有办法用SQL查询呢?
我使用JPA和MySql,但任何SQL查询都会有所帮助。
作为输入数据,我有一个当前用户的角色列表,我需要为他/她构建正确的菜单系统。因此,用户只能看到 MenuTabs / 菜单 / MenuItems
类:
class MenuTab {
List<Menu> menu;
List<Role> userRoles;
}
class Menu {
List<MenuItem> menuItems;
List<Role> userRoles;
}
class MenuItem {
List<Role> userRoles;
}
class User {
List<Role> userRoles;
}
表格:
menutab menutab_menu menutab_role
id menutabId menutabId
menuId roleId
menu menu_menuitem menu_role
id menuId menuId
menuitemId roleId
menuitem menuitem_role
id menuitemId
roleId
role
id
user user_role
id userId
roleId
答案 0 :(得分:0)
如果您使用的是Hibernate,则不必处理sql 我不熟悉Hibernate,但在NHibernate中你可以像这样利用HQL:
var _query = DetachedCriteria.For<MenuTab>()
.Add(Restrictions.In("userRoles", listOfRoles)
.Add(Restrictions.In("MenuItem.userRoles", listOfRoles);
答案 1 :(得分:0)
在SQL中我可能会做这样的事情:
SELECT
...
FROM menutab_menu tm
INNER JOIN menu_menuitem mi ON tm.menuId = mi.menuId
INNER JOIN menutab t ON tm.menutabId = t.Id
INNER JOIN menu m ON tm.menuId = m.Id
INNER JOIN menuitem i ON mi.menuitemId = i.Id
WHERE
t.Id IN (
SELECT tr.menutabId
FROM menutab_role tr
INNER JOIN user_role ur ON tr.roleId = ur.roleId
WHERE ur.userId = @userId
)
AND m.Id IN (
SELECT mr.menutabId
FROM menu_role mr
INNER JOIN user_role ur ON mr.roleId = ur.roleId
WHERE ur.userId = @userId
)
AND i.Id IN (
SELECT ir.menutabId
FROM menuitem_role ir
INNER JOIN user_role ur ON ir.roleId = ur.roleId
WHERE ur.userId = @userId
)
假设@userId
是当前用户ID,它作为参数传递给查询。