считать (*) в критериях гибернации? - PullRequest
21 голосов
/ 29 января 2010

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

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

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

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

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

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

Ответы [ 2 ]

30 голосов
/ 26 марта 2013

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

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

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

8 голосов
/ 03 февраля 2010

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

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

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

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

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

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