Сортировка на стороне клиента + Hibernate Paging? - PullRequest
3 голосов
/ 17 декабря 2009

Я использую GWT для пользовательского интерфейса и Hibernate / Spring для buisness-layer. Для отображения записей используется виджет GWT.

Я не получаю весь набор результатов, так как он огромен. Я использую

principals = getHibernateTemplate().findByCriteria(criteria,
                    fromIndex, numOfRecords);

для извлечения данных. Отсутствует критерий для сортировки в слое Hibernate.

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

Как лучше всего решить эту проблему?

ПРИМЕЧАНИЕ. Я могу получить столбцы первичной сортировки и другие столбцы сортировки с помощью инфраструктуры пользовательского интерфейса. Может быть, я могу отсортировать результат, используя primary-sort-column в слое гибернации?

Ответы [ 3 ]

4 голосов
/ 17 декабря 2009

Вам нужно отсортировать на сервере.

Тогда вы можете либо:

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

  • обрабатывать нумерацию страниц на стороне сервера . Клиент и сервер запрашивают только одну страницу за один раз из БД. Проблема в том, что вы будете снова и снова заказывать одни и те же данные для извлечения страницы 1, страницы 2 и т. Д. Каждый раз, когда вы запрашиваете у БД конкретную страницу. Это может быть проблемой с большой базой данных.

  • имеют компромисс между обоими (для большой базы данных):

    • Установить ограничение, скажем, 300 единиц
    • Сервер запрашивает у БД первые 301 элемент в соответствии с порядком по
    • Сервер хранит набор результатов (до 301 элемента) в кэше
    • Клиент запрашивает у сервера страницу за страницей
    • Сервер обрабатывает нумерацию страниц, используя кеш
    • Если имеется 301 элемент, клиент отображает «Список совпадений содержит более 300 элементов. Он был усечен».

Примечание 1: Обычно клиенту все равно, не сможет ли он перейти на последнюю страницу. Вы можете улучшить решение, чтобы сначала подсчитать общее количество строк (к тому времени нет необходимости в порядке), чтобы вы могли отображать сообщения, которые лучше для пользователя, например, «Результат содержал 2023 элемента, можно просмотреть только первые 300».

Примечание 2: если вы запрашиваете данные постранично в базе данных без использования какого-либо критерия порядка, большинство дБ (по крайней мере, Oracle) не гарантирует любой порядок. Таким образом, у вас может быть один и тот же элемент на страницах 1 и 2, если вы делаете два запроса к базе данных. Та же проблема возникает, если несколько товаров имеют одинаковое значение, используемое для заказа (например, на одну и ту же дату). БД не гарантирует никакого упорядочения между элементами с одинаковым значением. Если это так, то я бы предложил использовать PK в качестве критерия последнего заказа для упорядочения (например, ORDER BY date, PK), чтобы пейджинг выполнялся согласованным образом.

Примечание 3: я говорю о клиенте и сервере, но вы можете адаптировать идею к вашей конкретной ситуации.

3 голосов
/ 17 декабря 2009
  1. Всегда иметь столбец сортировки. По умолчанию это может быть "имя" или "идентификатор"
  2. Использовать подкачку на стороне сервера. То есть передайте индекс текущей страницы и извлеките соответствующее подмножество данных.
  3. В критерии / запросе выборки используйте столбец сортировки. Если ни один из них не выбран клиентом, используйте значение по умолчанию.

Таким образом, вы будете иметь желаемое поведение без компромиссов.

1 голос
/ 17 декабря 2009

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

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

Это оставляет только сортировку и подкачку на сервере. Вы можете использовать Criteria.addOrder () для сортировки в спящем режиме. См. этот урок .

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