Hibernate中的子查询功能

时间:2012-08-09 09:12:07

标签: java hibernate

我试图在我的Hibernate查询中使用子查询函数,但我是个白痴:)我的数据库表的结构是:

CREATE TABLE standard (
  id VARCHAR(12) NOT NULL ,
  title VARCHAR(99) NOT NULL ,
  description VARCHAR(999) NOT NULL ,
  revision VARCHAR(99) NOT NULL ,
  annotation TEXT NULL ,
  PRIMARY KEY (id) );

CREATE TABLE article (
  id VARCHAR(12) NOT NULL ,
  type INT(2) NOT NULL ,
  classTitle VARCHAR(99) NULL ,
  classDescription VARCHAR(999) NULL ,
  standard_id VARCHAR(12) NULL ,
  pubdate DATETIME NOT NULL ,
  title VARCHAR(99) NULL ,
  thumbnail TEXT NULL ,
  text TEXT NULL ,  
  PRIMARY KEY (id) );

我要做的是获得标准,其中包含具有指定类型的文章。我的想法是我按类型过滤文章,然后按标准分组,然后通过其ID获得标准。

像这样:)

DetachedCriteria subquery = DetachedCriteria.forClass(Article.class)
                             .add(Restrictions.eq("type", Constants.ARTICLE_TYPE_INTERPRETATION))
                              .setProjection(Projections.groupProperty("standardId"));

List<Standard> stds = (List<Standard>) session.createCriteria(Standard.class)
            .add(Restrictions.idEq(Subqueries.exists(subquery))).list();

但是这个查询给了我数据库中的所有标准,尽管事实上,子查询只返回我想要的标准。我知道问题出在哪里:我无法编写将通过subqery返回的id过滤标准的限制。

有人能给我一个提示怎么做吗?

非常感谢!

的Ondrej

修改 感谢@Rahul Agrawal

List<Standard> stds = (List<Standard>) session.createCriteria(Standard.class)
            .add(Subqueries.propertyIn("id", subquery)).list();

2 个答案:

答案 0 :(得分:1)

添加IN条件。 要添加“子查询中的where字段”,需要两个单独的条件。一个用于主(根)实体,另一个用于检索IN列表的值。 以下内容将检索具有订单商品的订单,该订单商品的库存级别为ZERO。结果转换器用于仅为每个实体检索一行,而不是由于在一对多关系上的连接而具有多行。 ?

DetachedCriteria ids = DetachedCriteria.forClass(ProductStock.class, "stock");
ids.add(Restrictions.eq("stock.stockLevel", 0));
ids.setProjection(Property.forName("productId"));

DetachedCriteria criteria = DetachedCriteria.forClass(Order.class, "order");
criteria.createAlias("order.orderItems", "items", CriteriaSpecification.LEFT_JOIN);
criteria.add(Subqueries.propertyIn("items.productId", ids));
criteria.setResultTransformer(Criteria.ROOT_ENTITY);

有关详细信息,请参阅:http://devgrok.blogspot.in/2008/11/hibernates-criteria-api.html

答案 1 :(得分:0)

我认为你正在寻找这个......

List<Standard> stds = (List<Standard>) session.createCriteria(Standard.class)
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            .add(Restrictions.idEq(Subqueries.exists(subquery))).list();