Hibernate noob:获取未映射关系的条件

时间:2012-02-12 03:08:34

标签: java hibernate criteria

我在多对多关系中有两个类,但只有一个有另一个列表。

@Entity
public class Product{
  @ManyToMany
  List<Category> categories;
  //...
}

@Entity
public class Category{
  //...
}

我想找到与使用标准的类别相关的所有产品,但以下内容并不起作用。

import static java.util.Collections.singletonList;

List<Product> getProductsByCategory(Category category){
    List<Product> results = getCurrentSession()
                            .createCriteria(Product.class)
                            .add(Restrictions.in("categories", singletonList(category)))
                            .list();
    if (results == null || results.size() <= 0)
        throw new EntityNotFoundException(category + "is empty");
    return results;
}

当然,如果将Product映射到Category,那将非常简单,但肯定Hibernate让你在没有它的情况下进行这样的查询。

编辑:

它返回Oracle错误

Caused by: java.sql.SQLException: Missing IN or OUT parameter at index:: 1

感谢您的帮助!

2 个答案:

答案 0 :(得分:2)

Criteria c = session.createCriteria(Product.class, "product");
c.createAlias("product.categories", "category");
c.add(Restrictions.eq("category.id", category.getId());
List<Product> results = c.list();

注意:结果列表永远不会为空。它的大小永远不会< 0.如果类别没有任何产品,则返回空列表是正确的。在这种情况下我不会抛出异常。

答案 1 :(得分:0)

List<Product> results = getCurrentSession().createCriteria(Product.class)
                        .createCriteria("categories")
                            .add(Restrictions.in("id", uniqueIds(categories)))
                        .list();