Гибернация «многие ко многим»: критерии поиска всех классов А, которые НЕ содержат класс В - PullRequest
1 голос
/ 09 марта 2012

У меня есть отношение многие ко многим между Item и ItemCategory. Что касается Предмета, я хочу знать, в каких категориях Предмета нет. Я также хочу знать, для какой Предмета нет категорий. SQL для второго должен быть примерно таким:

SELECT item 
FROM Item AS item 
WHERE item.id NOT IN (SELECT item2.id FROM Item AS item2 LEFT JOIN item2.categories AS cat WHERE cat.id = ?)

Я использую DetachedCriteria, потому что я включаю это как часть специального запроса. Я думаю, что я близок к решению, но похоже, что Hibernate не генерирует правильное решение. Мой код имеет это:

DetachedCriteria subquery = DetachedCriteria.forClass(Item.class, "item");
DetachedCriteria catSubquery = subquery.createCriteria("categories", "cat");
SimpleExpression criterion = Restrictions.eq("id", value);

catSubquery.add(criterion);
criteria.add(Subqueries.propertyNotIn("id", subquery));

Сгенерированный SQL выглядит так:

select ... 
from wine.categories this_ 
where this_.CATEGORY_ID not in 
  (select this0__.CATEGORY_ID as y0_ 
   from wine.categories this0__ 
   where item1_.INVENTORY_ITEM_ID=?)

Обратите внимание, что в нем отсутствует таблица соединений (называемая "item_categories"). Как мне это исправить?

Подробнее: вот отображение Hibernate для "ItemCategory.items"

<set name="items" table="item_categories" lazy="true" inverse="true"
  cascade="none" sort="unsorted">
  <cache usage="nonstrict-read-write"/>

  <key column="ITEM_CATEGORY_ID">
  </key>

  <many-to-many class="com.dr_dee_sw.wine.dto.Item" column="ITEM_ID"
    outer-join="auto"/>

</set>

Ответы [ 2 ]

0 голосов
/ 15 марта 2012

Ответ оказывается гораздо более обыденным.В используемой мной версии Hibernate (3.2) была ошибка.Это по сути не поддерживает то, что мне нужно.Просто обновление до Hibernate 3.6 сделало свое дело.

0 голосов
/ 09 марта 2012
// get all items which are not in the specified category

List<Item> itemsNotInCategory = DetachedCriteria.forClass(Item.class)
    .add(Subquery.propertyNotIn("id", DetachedCriteria.forClass(Category.class)
        .add(Restrictions.eq("id", catid))
        .createAlias("items", "item")
        .setProjections(Projections.Distinct(Projections.Property("item.id")))
    ))
    .List();
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...