我在Item和ItemCategory之间有多对多的关系。对于一个项目,我想知道该项目不在什么类别。我也想知道一个ItemCategory,该类别没有的项目。对于第二个的SQL应该是这样的:休眠多对多:查找所有不包含类B的类A的标准
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”)。我该如何解决?
更多信息:这里的 “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>
这似乎解决了我有一个错误,但它仍然没有指定连接表。子查询现在“从类别this0__中选择不同的item1_.ITEM_ID作为y0_,其中this0 __。CATEGORY_ID =?” – 2012-03-11 06:49:54
看起来像一个映射错误。你可以发布类别的映射吗?它从哪里获得'item1_'? – Firo 2012-03-11 15:07:21
item1_来自我尝试不同的别名尝试调试它。 – 2012-03-12 03:00:44