例如,如果我做了类似的事情:
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();
如何使用相同的条件实例,但删除(例如)第二个标准?我正在尝试构建一个动态查询,我想让用户删除一个过滤器,而后端不必从头开始重建标准。
谢谢
据我所知,一旦你创建它,就没有办法从条件查询中删除东西(限制,排序等)。我对Criteria API的内部知识不够了,但我知道暴露的界面中没有任何东西。您可以尝试操纵传递给add
或addOrder
的对象,但这听起来像是值得付出的工作,特别是当有更清洁的替代品时。
在我看到的每个应用程序中,Criteria查询肯定是一次性使用。
现在,您可以做的是以自定义格式存储您的限制,排序和限制(例如,Collection
),然后从存储的格式中轻松构建您的查询。这可能对您的用户界面更有意义,因为您当然需要细粒度控制。
不是你要找的答案,我敢肯定,但这正是我过去所做的。
HTH
如何使用相同的条件实例,但删除(例如)第二个标准?我正在尝试构建一个动态查询,我想让用户删除一个过滤器,而后端不必从头开始重建标准。
你不能,你必须重新发送用于构建动态查询的整个(更新的)参数集。
您可以通过以下方式删除标准:
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();
}
}
}
}