Hibernate (HQL) - как найти уникальный запрос от многих ко многим таблицам? - PullRequest
0 голосов
/ 02 ноября 2011
public class Menu { 
  private int menuId; 
  private String name;
  private Set<Item> items=new HashSet<Item>(); 

} 
public class Item { 
  private int itemId; 
  private String name; 
  private Set<Menu> menus=new HashSet<Menu>();
}

xml меню:

<class name="Menu" table="menu">
    <id name="menuId" type="java.lang.Integer" column="menuId">
        <generator class="increment"></generator>
    </id>
    <property name="name" type="string" column="menuName" length="100"></property>
    <set access="property" lazy="true" inverse="false" cascade="save-update"
        name="items" batch-size="10" fetch="select" table="menu_item">
        <key column="menuId" />
        <many-to-many class="Item" column="itemId" />
    </set>

xml элемента:

<class name="Item" table="item">
    <id name="itemId" type="java.lang.Integer" column="itemId">
        <generator class="increment"></generator>
    </id>
    <property name="name" type="string" column="itemName" length="100"></property>
    <set access="property" lazy="true" inverse="false" cascade="save-update"
        name="menus" batch-size="10" fetch="select" table="menu_item">
        <key column="itemId" />
        <many-to-many class="Menu" column="menuId" />
    </set>
</class>

question1: Я хотел бы найти меню, чьи itemIds itemIdsне 1 или 2. Например, itemIds пунктов одного меню - 1,3,4.Я пытаюсь сделать hql следующим образом:

select menu 
from Menu menu, In(menu.items) items 
where items.itemId not in (1,2)

Но на самом деле он найдет это меню.

Как я могу это сделать?

question2: Я хотел бы найтименю, чьи itemIds элемента равны 1 и 2 одновременно.Я пытаюсь сделать hql следующим образом:

выбрать меню из меню меню, в (menu.items) элементы, где items.itemId в (1,2)

но на самом деле он найдет менючьи itemIds 1 или 2, а не 1 и 2. Как я могу это сделать?

Спасибо.

Ответы [ 2 ]

0 голосов
/ 03 ноября 2011

я нашел сам 1. из меню меню, где 2 = (выберите count (menu.id) из меню меню, In (menu.items) элементы, где items.itemId in (1,2)) 2. выберите menu2 из меню menu2, где 3 = (выберите count (menu.id) из меню Menu, In (menu.items) элементы, где items.itemId in (1,2,3) и menu.menuId = menu2.menuId)

0 голосов
/ 02 ноября 2011

Я предлагаю вам использовать запрос Criteria для этого, если он приемлем. Следующим является фрагмент

DetachedCriteria dc = DetachedCriteria.forClass(Menu.class);
List<Menu> list = new ArrayList<Menu>();
dc.createAlias("items","item");
dc.add(Restrictions.and(
     Restrictions.ne("item.itemId",1),
               Restrictions.ne("item.itemId",2)));
list = hibernateTemplate.findByCriteria(dc);

Это дает вам все меню с ItemId, не равным 1 и 2.

Используйте аналогичный запрос и для другого вопроса. Надеюсь, это поможет вам.Кстати, я не проверял это решение.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...