Как вы можете удалить критерий из критериев? - PullRequest
6 голосов
/ 12 марта 2010

Например, если я сделаю что-то вроде:

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 ]

6 голосов
/ 12 марта 2010

Насколько я знаю, нет способа удалить вещи (ограничения, упорядочение и т. Д.) Из запроса критериев после его создания. Я недостаточно осведомлен о внутренностях API Criteria, но я знаю, что в открытом интерфейсе ничего нет. Вы можете попробовать манипулировать объектами, которые вы передаете в add или addOrder, но это звучит как большая работа, чем она того стоит, особенно когда есть более чистые альтернативы.

Критерии запросов были одноразовыми в каждом приложении, которое я видел.

Теперь вы можете сохранить свои ограничения, заказы и ограничения в произвольном формате (например, Collection), а затем довольно просто построить запрос из этого сохраненного формата. Это, вероятно, будет иметь больше смысла для вашего пользовательского интерфейса, поскольку вам, безусловно, необходим детальный контроль.

Я не уверен, что вы ищете ответ, но это именно то, что я делал в прошлом.

НТН

1 голос
/ 13 марта 2010

Как я могу использовать тот же экземпляр критерия, но удалить (например) второй критерий? Я пытаюсь создать динамический запрос, в котором я хотел бы позволить пользователю удалить фильтр, при этом бэкэнду не нужно восстанавливать критерии с нуля.

Вы не можете, вам придется повторно отправить весь (обновленный) набор параметров, использованных для построения динамического запроса.

0 голосов
/ 15 июля 2017

Вы можете удалить критерии следующим образом:

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