1

我正在尝试在我的 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 对它们进行分组,然后通过其 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 过滤标准的限制。

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

非常感谢 !

翁德雷

编辑: 感谢@Rahul Agrawal

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

2 回答 2

2

添加一个 IN 条件。要添加“子查询中的 where 字段”,需要两个单独的条件。一个用于主(根)实体,另一个用于检索 IN 列表的值。以下检索具有产品库存水平为零的订单项目的订单。结果转换器用于仅检索每个实体的一行,而不是作为一对多关系连接的结果而具有多行。?

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

于 2012-08-09T09:40:22.800 回答
0

我想你正在寻找这个..

List<Standard> stds = (List<Standard>) session.createCriteria(Standard.class)
            .setResultTransformer(Criteria.DISTINCT_ROOT_ENTITY)
            .add(Restrictions.idEq(Subqueries.exists(subquery))).list();
于 2012-08-09T09:17:42.997 回答