2010-03-12 89 views
5

舉例來說,如果我這樣做:如何從條件中刪除條件?

Criteria c = session.createCriteria(Book.class) 
      .add(Expression.ge("release",reDate); 
      .add(Expression.ge("price",price); 
      .addOrder(Order.asc("date")) 
      .setFirstResult(0) 
      .setMaxResults(10); 
c.list(); 

如何使用相同的標準實例,但刪除(例如)第二個標準? 我試圖建立一個動態查詢,我想讓用戶刪除一個過濾器,而不需要從頭開始重新構建標準。

謝謝

回答

6

據我所知,目前還沒有辦法從標準的查詢中刪除的東西(的限制,排序等),一旦你創建它。我對Criteria API的內部知識不夠了解,但我知道在暴露的接口中沒有任何東西。你可以嘗試操縱你傳遞給addaddOrder的物體,但這聽起來像比它值得的更多的工作,特別是當有更清潔的替代品時。

在我看到的每個應用程序中,標準查詢肯定是一次性使用。

現在,您可以做的是以自定義格式(例如,Collection)存儲您的限制,排序和限制,然後從存儲格式中輕鬆構建您的查詢。這可能會讓你的用戶界面更有意義,因爲你肯定需要從那裏進行細粒度的控制。

不是你要找的答案,我敢肯定,但這正是我過去所做的。

HTH

1

如何我可以使用相同的標準實例,但刪除(例如)第二個標準?我試圖建立一個動態查詢,我想讓用戶刪除一個過濾器,而不需要從頭開始重新構建標準。

您不能,您將不得不重新發送用於構建動態查詢的整個(更新的)參數集。

0

您可以刪除這種方式準則:

public static void List<CriterionType> removeCriterions(Criteria criteria, Class<? extends Criterion> type) { 
    Iterator<CriterionEntry> criterionIterator = ((CriteriaImpl) criteria).iterateExpressionEntries(); 
    while (criterionIterator.hasNext()) { 
     CriterionEntry criterionEntry = criterionIterator.next(); 
     if (criterionEntry.getCriteria() == criteria) { 
      Criterion criterion = criterionEntry.getCriterion(); 
      if (null == type || criterion.getClass() == type) { 
       criterionIterator.remove(); 
      } 
     } 
    } 
}