2012-01-13 2 views
1

Мы используем Primfaces 3.0.RC2 в нашем приложении со строками и CDI. Мы следовали реализации ленивой загруженной таблицы данных в витрине компонентов. Поскольку у нас есть большой набор данных, мы переопределили метод load(), чтобы получить только результаты с помощью страницы. (одновременно загружая все записи в память).Основные шрифты - Пользовательская разбивка на страницы/Сортировка нагрузки() issue

Пагинация работает как и ожидалось, однако сортировка не выполняется. Записи сортируются правильно при первом щелчке заголовка столбца. Для всех последующих кликов метод load() вызывается дважды, отправляя разные значения для порядка сортировки, в результате чего порядок сортировки остается неизменным в таблице. Кажется, что вызовы load() выполняются на этапе APPLY_REQUEST_VALUES.

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

Дополнительная информация: Как уже говорилось ранее, мы переопределили метод load() и попросили БД выполнить выборку отсортированных результатов по странице (путем указания максимальных результатов и порядка в запросе), и он отлично работает.

@Override 
public List<ABC> load(int first, int pageSize, String sortField, SortOrder 
sortOrder, Map<String, String> filters) 
{ 
    // Fetch data pagewise from the database 
    datasource = dao.findPagewiseSortedResults(sortField, 
      SortOrder.ASCENDING == sortOrder ? true : false, first, pageSize); 

    // Set the row count 
    this.setRowCount((int) dao.findTotalCount()); 

    return datasource; 
} 

Однако при нажатии столбца на datamodel для сортировки создаются 2 почтовых запроса.

Поиск ниже код Xhtml:

 <p:dataTable id="dataTable" var="record" 
     value="#{testBean.lazyModel}" paginator="true" rows="5" 
     paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport}   {NextPageLink} {LastPageLink}" 
     selectionMode="single" selection="#{testBean.selectedRecord}" 
     sortBy="#{record.username}"> 

     <p:ajax event="rowSelect" listener="#{testBean.onRowSelect}" 
      update=":form:display" oncomplete="accountDialog.show()" /> 

     <p:ajax event="colResize" update=":form:growl" 
      listener="#{testBean.onResize}" /> 

     <p:column sortBy="#{record.username}" 
      filterBy="#{record.username}"> 
      <f:facet name="header"> 
       <h:outputText value="User Name" /> 
      </f:facet> 
      <h:outputText value="#{record.username}" /> 
     </p:column>......... 

     </dataTable> 

Мы даже обновлен до последней версии Primefaces (3.0.1), но это не помогло. Мы что-то упускаем? Любые указатели будут очень полезны.

Спасибо.

+0

Я использую 3.0 Final с Lazy Loading, filterin g и сортировки, но не вижу этого. Даже если в нем присутствует такая ошибка (но это не так), вы всегда можете прочитать поле sortOrder и действовать соответственно. Может быть, лучше, если вы разместите код – perissf

+0

@ perissf, спасибо за ответ. Я добавил код в исходный вопрос. Пожалуйста, дайте мне знать, если вам нужна дополнительная информация/ – gkari

ответ

0

Поскольку вы предоставляете сортировку с использованием метода load(), вам не нужно использовать собственный инструмент сортировки dataTable. Вам необходимо удалить атрибут sortBy с тега p:dataTable.

Компонент должен быть определен следующим образом:

<p:dataTable id="dataTable" var="record" 
    value="#{testBean.lazyModel}" paginator="true" rows="5" 
    paginatorTemplate="{FirstPageLink} {PreviousPageLink} {CurrentPageReport}   {NextPageLink} {LastPageLink}" 
    selectionMode="single" selection="#{testBean.selectedRecord}" > 

EDIT

Таким образом, вы будете иметь свой столбец Сортируемый точно в порядке, указанном клиентом: вы будете читать SortOrder указан с кодом Java, который вы опубликовали, и вы будете использовать этот SortOrder, следовательно, в вашей реализации dao # findPagewiseSortedResults()

+0

Еще раз спасибо perissf. Но не означает ли это, что записи всегда будут отсортированы в порядке, указанном в запросе моей базы данных. Как я могу предоставить пользователю возможность сортировки их по порядку asc/desc. Я хочу сохранить сортировку столбцов и в зависимости от указанного порядка сортировки, применяется предложение order by в запросе. Есть ли способ сделать это? – gkari

+0

Я обновил свой ответ. Не уверен, чтобы понять, что вы спрашиваете – perissf

+0

Я думал, что вы попросили также удалить атрибуты sortBy из столбцов. Прошу прощения за путаницу. Я удалил атрибут sortBy из datatable. Результаты сортируются и извлекаются из базы данных в порядке следования.Однако при нажатии столбца на обратный порядок сортировки он меняет порядок правильно и после этого всегда сортируется по порядку (независимо от того, сколько раз я нажимаю). Я вижу, что он отправляет сортировку asc на бэкэнд (первый вызов load()), но это сопровождается и немедленно отменяется порядком сортировки по порядку (второй вызов load()), и похоже, что сортировка не происходила. Любые вести? – gkari

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