Count (*) в спящих критериях?
У меня есть комбинация критериев поиска, которые реализуются с использованием критериев спящего режима.
И я добавил разбивку на страницы следующим образом:
criteria.setFirstResult(offset).setMaxResults(pageSize).setFetchSize(pageSize).list();
Этого недостаточно для разбивки на страницы, поэтому я подсчитал общий размер результата.
totalResult = (Integer)criteria.setProjection(Projections.rowCount()).uniqueResult();
Проблема в том, что в первый раз, когда я отправляю форму поиска, у меня есть правильный итог.
Когда я нажимаю следующую страницу и меняет смещение, я получил второй экземпляр NullPointExcetion. Я не знаю почему. И через отладку я вижу, когда возникает это исключение, первый оператор успешно возвращает разбитые на страницы результаты.
Итак, я хочу спросить, второй конфликт противоречит второму? (потому что первый оператор устанавливает fetchsize в 10, и мне интересно, будет ли функция count (*) работать правильно.
они разные задачи, используя те же критерии, как я могу клонировать или копировать один критерий, который уже имеет многочисленные ограничения?)
Ответы
Ответ 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