Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Hibernate多对多:查找不包含类B的所有类A的条件_Java_Hibernate - Fatal编程技术网

Java Hibernate多对多:查找不包含类B的所有类A的条件

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

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 = ?)
我之所以使用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();