Фильтр подсписков приводит к SQL-запросу - PullRequest
2 голосов
/ 19 декабря 2011

У меня есть система меню, где MenuTabs - верхний уровень, они содержат Меню , а Меню содержит MenuItem s.

Каждый уровеньУ элемента есть список пользователей Роль s, для которых он должен быть видим.

Мне нужно создать запрос к базе данных, чтобы выбрать MenuTabs, который содержит только видимые меню с видимыми элементами меню для текущего пользователя.Можно ли это сделать с помощью 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 голосов
/ 19 декабря 2011

В 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 - это текущий идентификатор пользователя, который передается в запрос в качестве параметра.

0 голосов
/ 19 декабря 2011

если вы используете Hibernate, вам не нужно иметь дело с SQL, я не знаком с Hibernate, но в NHibernate вы можете использовать HQL следующим образом:

var _query = DetachedCriteria.For<MenuTab>()
                                .Add(Restrictions.In("userRoles", listOfRoles)
                                .Add(Restrictions.In("MenuItem.userRoles", listOfRoles);
...