6

例如,如果我做类似的事情:

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();

如何使用相同的条件实例,但删除(例如)第二个条件?我正在尝试构建一个动态查询,我想让用户在其中删除过滤器,而后端不必从头开始重建条件。

谢谢

4

3 回答 3

6

据我所知,一旦创建,就无法从条件查询中删除事物(限制、排序等)。我对 Criteria API 的内部知识不够了解,但我知道暴露的接口中没有任何内容。您可以尝试操作传递给addor的对象addOrder,但这听起来比它的价值更多,尤其是当有更清洁的替代方案时。

在我见过的每个应用程序中,条件查询肯定是一次性使用的。

现在,您可以做的是以自定义格式(例如,Collection)存储您的限制、排序和限制,然后从该存储格式轻松构建您的查询。这可能对您的用户界面更有意义,因为您当然需要从那里进行细粒度控制。

我敢肯定,这不是您要寻找的答案,但这正是我过去所做的。

高温高压

于 2010-03-12T16:15:43.473 回答
1

如何使用相同的条件实例,但删除(例如)第二个条件?我正在尝试构建一个动态查询,我想让用户在其中删除过滤器,而后端不必从头开始重建条件。

您不能,您必须重新发送用于构建动态查询的整个(更新的)参数集。

于 2010-03-12T23:29:22.327 回答
1

您可以通过这种方式删除标准:

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();
            }
        }
    }
}
于 2017-07-14T21:31:33.223 回答