2

MenuTabs - 最上位、 Menu が含まれ、 MenuMenuItemが含まれるメニュー システムがあります。

各レベル項目には、それが表示される必要があるユーザーRoleのリストがあります。

現在のユーザーに表示されている MenuItems を持つ表示されているメニューのみを含む MenuTabs を選択するデータベース クエリを作成する必要があります。SQLクエリでそれを行う方法はありますか?

私は JPA と MySql を使用していますが、どの SQL クエリも役に立ちます。

入力データとして、現在のユーザーの役割のリストがあり、そのユーザーに適したメニュー システムを構築する必要があります。したがって、ユーザーには許可されたMenuTabs / Menus / 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
4

2 に答える 2

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
  )

は現在のユーザー ID であると想定さ@userIdれ、パラメーターとしてクエリに渡されます。

于 2011-12-19T14:26:56.780 に答える
0

Hibernate を使用している場合、SQL を処理する必要はありません。Hibernate には詳しくありませんが、NHibernate では次のように HQL を利用できます。

var _query = DetachedCriteria.For<MenuTab>()
                                .Add(Restrictions.In("userRoles", listOfRoles)
                                .Add(Restrictions.In("MenuItem.userRoles", listOfRoles);
于 2011-12-19T13:26:49.770 に答える