Динамически удалить порядок в наборе результатов в org.hibernate.Criteria - PullRequest
5 голосов
/ 03 марта 2010

У меня есть критерии с:

Criteria criteria= session.createCriteria(Libro.class).addOrder( Order.asc("ID") );

Однако, когда я хочу получить счетчик строк, сбой:

criteria.setProjection(Projections.rowCount());  

потому что в запросе есть заказ.

Как динамически убрать порядок в Критериях?

Я имею в виду, я ищу, как criteria.removeOrder("ID").

Ответы [ 6 ]

6 голосов
/ 20 декабря 2012

Большинство критериев на самом деле являются экземплярами CriteriaImpl. Если вы приведете свои Критерии к CriteriaImpl и получите итератор для заказов, вы можете удалить их таким образом.

Criteria criteria= session.createCriteria(Libro.class).addOrder( Order.asc("ID") );
Iterator<Order> orderIter = ((CriteriaImpl)criteria).iterateOrderings();
while (orderIter.hasNext()) {
    orderIter.next();
    orderIter.remove();
}

Long totalRows = (Long)criteria.setProjection(Projections.rowCount()).uniqueResult();
5 голосов
/ 05 марта 2010

Звучит так, будто вы пытаетесь повторно использовать критерии, созданные для получения упорядоченного списка, вместо того, чтобы получить счет.

Вместо того, чтобы пытаться использовать одни и те же Критерии для извлечения данных и подсчета, лучше всего просто создать независимые Критерии.

Используйте

Criteria orderCriteria= session.createCriteria(Libro.class)
                               .addOrder( Order.asc("ID") );

для получения списка по порядку и использования

Criteria countCriteria= session.createCriteria(Libro.class)
                               .setProjection(Projections.rowCount());

чтобы получить счет.

Чтобы использовать один и тот же критерий для двух целей, вы должны изменить состояние между использованиями. Я не уверен, как удалить заказ (или если вам действительно нужно для того, чтобы сделать подсчет). Для удаления проекции требуется setProjection(null).

1 голос
/ 20 ноября 2012

criteria.ClearOrders() - метод NHibernate для удаления ордеров.

В Java такого метода нет. И мое решение этой проблемы заключается в использовании Order в качестве еще одного параметра передачи вместе с Criteria для функции запроса пагинации

1 голос
/ 06 сентября 2010

Я также столкнулся с той же проблемой .. но я добился следующего пути,

Перед оформлением заказа я запросил количество записей,

criteria.addOrder(pageCriteria.isSortDescending() ? Order
                            .desc(pageCriteria.getSortBy()) : Order
                            .asc(pageCriteria.getSortBy()));

pageCriteria.setTotalRecords(((Integer) criteria
                            .setProjection(Projections.rowCount())
                            .uniqueResult()).intValue());
                criteria.setProjection(null);
                criteria.setFirstResult(
                        pageCriteria.getFirstRecordOfCurrentPage())
                        .setMaxResults(pageCriteria.getRecordsPerPage());
                criteria
                        .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

Приведенный выше код хорошо работает для меня.

0 голосов
/ 14 января 2011

вы не можете удалить заказ по критериям. мое решение для нумерации страниц - передать Order [] в качестве параметра метода, который выполняет нумерацию страниц.

Вы должны делать это, только если db - это db2 as400 или другая база данных, которая не разрешает заказ в пределах select count(*).

0 голосов
/ 10 марта 2010

Если вы получаете критерий в качестве параметра и выполняете с ним некоторые вычисления, вы можете использовать .Clone (), как здесь:

    private static int GetTotalRows(ICriteria criteria)
    {
        var countCriteria = (ICriteria)criteria.Clone();
        return Convert.ToInt32(countCriteria.SetProjection(Projections.RowCount()).UniqueResult());
    }

Другое решение заключается в использовании ClearOrders, который удалит весь список заказов.

    private static int GetTotalRows(ICriteria criteria)
    {
        criteria.ClearOrders();
        ...
    }

Привет

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...