Подтвердить что ты не робот

Count (*) в спящих критериях?

У меня есть комбинация критериев поиска, которые реализуются с использованием критериев спящего режима. И я добавил разбивку на страницы следующим образом:

criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();

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

totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();

Проблема в том, что в первый раз, когда я отправляю форму поиска, у меня есть правильный итог. Когда я нажимаю следующую страницу и меняет смещение, я получил второй экземпляр NullPointExcetion. Я не знаю почему. И через отладку я вижу, когда возникает это исключение, первый оператор успешно возвращает разбитые на страницы результаты.

Итак, я хочу спросить, второй конфликт противоречит второму? (потому что первый оператор устанавливает fetchsize в 10, и мне интересно, будет ли функция count (*) работать правильно. они разные задачи, используя те же критерии, как я могу клонировать или копировать один критерий, который уже имеет многочисленные ограничения?)

4b9b3361

Ответ 1

Я думаю, что конфликт на самом деле является ограничением в запросе count, поэтому я ожидаю, что он вернет неправильные результаты во второй прогон запроса страницы.

Использование одного критерия для обоих требует некоторой перезагрузки между использованиями, что, вероятно, может быть выполнено по строкам:

 criteria.setProjection(null)
         .setResultTransformer(Criteria.ROOT_ENTITY);

Если вам действительно нужны два отдельных, но одинаковых критерия, я думаю, что самый простой способ - сначала создать DetachedCriteria, который является Serializable, и использовать клонирование клонирования сериализации-десериализации для создания другого, прежде чем преобразовать их в обычные критерии, на сеанс.

Но если вы можете работать в reset, вам может не понадобиться два.

Ответ 2

Просто исправить запрос count (*) - лучше использовать этот код для критериев:

Integer totalResult = ((Number)criteria.setProjection(Projections.rowCount()).uniqueResult()).intValue();

в противном случае вы получите сообщение об ошибке java.lang.Long cannot be cast to java.lang.Integer