我试图在我的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();
答案 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();