2012-08-09 110 views
0

我想在我的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返回的標準過濾標準的限制。

有人可以給我一個提示如何做到這一點?

非常感謝!

的Ondrej

編輯: 由於@Rahul阿格拉瓦爾

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

回答

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

+0

謝謝,'Subqueries.propertyIn'是我一直在尋找:) – s0vet 2012-08-09 10:04:12

0

我認爲你正在尋找的東西這個..

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

不,我不想DISTINCT的結果,我想根據其IDS保存在subqery從數據庫獲取對象:)我不知道如果我我很好地解釋我的問題。 – s0vet 2012-08-09 09:21:56