如何从标准中删除标准?

时间:2010-03-12 15:55:54

标签: java hibernate orm hibernate-criteria

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

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

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

谢谢

3 个答案:

答案 0 :(得分:6)

据我所知,一旦你创建它,就无法从条件查询中删除(限制,排序等)。我对Criteria API的内部知识不够了,但我知道暴露的界面中没有任何东西。你可以尝试操纵你传递给addaddOrder的对象,但这听起来比工作更有价值,特别是在有更清洁的选择时。

标准查询肯定是我见过的每个应用程序中的一次性使用。

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

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

HTH

答案 1 :(得分:1)

  

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

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

答案 2 :(得分: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();
            }
        }
    }
}