У меня есть отношение многие ко многим между 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>