2010-01-29 10 views
20

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

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

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

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

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

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

ответ

7

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

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

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

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

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

+0

Спасибо, на самом деле мое решение точно так же с вашими ответами. Оно работает ! – Sawyer

28

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

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

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

+6

Приятный способ без приведения: 'Integer totalCount = criteria.setProjection (Projections.rowCount()). UniqueResult(). HashCode();'. У вас будет тот же результат. –

+0

аккуратный трюк! не понимал этого, пока не увидел вас комментарий и посмотрел исходный код jdk. – Yogi

+0

Я не уверен, что доверяю твоему опрятному трюку (хотя я впечатлен). Контракт hashCode() говорит, что хеш-код не должен оставаться неизменным от одного запуска к другому, поэтому Oracle полностью в пределах своих прав изменять метод hashCode(), хотя это маловероятно. Тем не менее, я бы просто позвонил intValue(). – MiguelMunoz

Смежные вопросы