2012-03-09 6 views
1

ItemとItemCategoryの間に多対多の関係があります。アイテムについては、アイテムが入っていないカテゴリを知りたいと思っています。また、カテゴリにはアイテムがないItemCategoryも知りたいと思っています。私は、アドホッククエリの一部としてこれを含めていますので、私はDetachedCriteriaをを使用していHibernate多対多:クラス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 = ?) 

:秒1のためのSQLは次のようなものでなければなりません。私は解決策に近いと思いますが、Hibernateが正しい解決策を生成していないようです。私のコードは、このしています( "item_categories" と呼ばれる)、それは、結合テーブルを欠けていることを

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=?) 

注:

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は、次のようになります。これをどうやって解決するのですか?

詳細情報:ここでは "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

これは、私が持っていた1つのエラーを修正するようですが、それでもまだ結合テーブルを指定していません。サブクエリは現在、「this0__カテゴリCATEGORY_ID =?」というカテゴリからy0_として別個のitem1_.ITEM_IDを選択しています。 –

+0

はマッピングエラーのようです。カテゴリのマッピングを投稿できますか?どこから 'item1_'を取得しますか? – Firo

+0

item1_は、デバッグしようとすると別のエイリアスを試してきました。 –

関連する問題