2012-03-09 55 views
1

我在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> 

回答

0

答案原来是更为平凡的Hibernate映射。在我使用的Hibernate版本中存在一个错误(3.2)。它本质上不支持我所需要的。只需升级到Hibernate 3.6就可以了。

0
// 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(); 
+0

这似乎解决了我有一个错误,但它仍然没有指定连接表。子查询现在“从类别this0__中选择不同的item1_.ITEM_ID作为y0_,其中this0 __。CATEGORY_ID =?” – 2012-03-11 06:49:54

+0

看起来像一个映射错误。你可以发布类别的映射吗?它从哪里获得'item1_'? – Firo 2012-03-11 15:07:21

+0

item1_来自我尝试不同的别名尝试调试它。 – 2012-03-12 03:00:44