如何从标准中删除标准?

问题描述 投票:6回答:3

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

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

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

谢谢

java hibernate orm hibernate-criteria
3个回答
6
投票

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

在我看到的每个应用程序中,Criteria查询肯定是一次性使用。

现在,您可以做的是以自定义格式存储您的限制,排序和限制(例如,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();
            }
        }
    }
}
© www.soinside.com 2019 - 2024. All rights reserved.