筛选器子列表导致SQL查询

时间:2011-12-19 11:56:03

标签: mysql sql jpa filter sublist

我有一个菜单系统,其中 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

2 个答案:

答案 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,它作为参数传递给查询。