Java Hibernate多对多:查找不包含类B的所有类A的条件
Item和ItemCategory之间存在多对多关系。对于一个项目,我想知道该项目不在哪些类别中。我还想知道对于ItemCategory,该类别没有哪些项目。第二个的SQL应该是这样的:Java Hibernate多对多:查找不包含类B的所有类A的条件,java,hibernate,Java,Hibernate,Item和ItemCategory之间存在多对多关系。对于一个项目,我想知道该项目不在哪些类别中。我还想知道对于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 = ?) 我之所以使用Detached
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”)。我该如何解决这个问题
更多信息:下面是“itemcegory.items”的Hibernate映射
//获取不在指定类别中的所有项目
List itemsNotInCategory=DetachedCriteria.forClass(Item.class)
.add(Subquery.propertyNotIn(“id”),DetachedCriteria.forClass(Category.class)
.add(限制条件eq(“id”,catid))
.createAlias(“项目”、“项目”)
.setProjections(Projections.Distinct(Projections.Property(“item.id”))
))
.List();
答案变得更加平淡无奇。我使用的Hibernate版本(3.2)中有一个bug。它本质上不支持我需要的东西。升级到Hibernate 3.6就成功了。这似乎修复了我遇到的一个错误,但它仍然没有指定联接表。子查询现在是“从类别this0\uuuu中选择不同的item1\uu.ITEM\u ID作为y0\uu”,其中this0\uuuu.CATEGORY\u ID=?”看起来像是映射错误。你能发布类别映射吗?它是从哪里得到的呢?item1来自我在调试它时尝试了不同的别名。
<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>
// 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();