Сортировка не работает в datatable в PrimeFaces?

Сортировка не работает в datatable в PrimeFaces. Пожалуйста, предложите.

См. ниже мой .xhtml файл

<h:form>

  <p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >

    <f:facet name="header">
      <h2>Cars View</h2>
    </f:facet>

    <p:column sortBy="#{entry.carno}" filterBy="#{entry.carno}">
      <f:facet name="header">
        <h:outputText value="Car Number" />
      </f:facet>
      <h:outputText value="#{entry.carno}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings['car-model']}" filterBy="#{entry.carsettings['car-model']}">
      <f:facet name="header">
        <h:outputText value="Car Model"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings['car-model']}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings.year}" filterBy="#{entry.carsettings.year}">
      <f:facet name="header">
        <h:outputText value="Car Year"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings.year}"></h:outputText>
    </p:column>

    <p:column sortBy="#{entry.carsettings.color}" filterBy="#{entry.carsettings.color}">
      <f:facet name="header">
        <h:outputText value="Car Color"/>
      </f:facet>
      <h:outputText value="#{entry.carsettings.color}"></h:outputText>
    </p:column>
  </p:dataTable>
</h:form>

@Sean

Посмотрите ниже код

         Список автомобилей             

    <ui:composition template="/template.xhtml">
        <ui:define name="content">
            <f:view>
                <f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>
                <center>
                    <h1>Car View</h1>
                    <h:outputText value="No data found" style="font-size: 15px;font-family: Arial, Verdana,Helvetica, sans-serif" rendered="#{MyBackingBean.noDataExist}"></h:outputText>
                    <h:form id="dataform1">
                        <p:dataTable var="item" value="#{MyBackingBean.dataList}" dynamic="true" paginator="true" rows="2" id="table"  style="width:60%"
                                     rendered="#{!MyBackingBean.noDataExist}" >
                            <p:column sortBy="#{item.id}" filterBy="#{item.id}">
                                <f:facet name="header">
                                    <h:outputText value="ID" />
                                </f:facet>
                                <h:outputText value="#{item.id}" />
                            </p:column>
                            <p:column sortBy="#{item.carsettings['car-color']}" filterBy="#{item.carsettings['car-color']}">
                                <f:facet name="header">
                                    <h:outputText value="Color" />
                                </f:facet>
                                <h:outputLink target="_blank" value="http://#{item.carsettings['car-color']}">
                                    <h:outputText value="#{item.carsettings['car-color']}" />
                                </h:outputLink>
                            </p:column>
                            <p:column sortBy="#{item.carsettings.model}" filterBy="#{item.carsettings.model}">
                                <f:facet name="header">
                                    <h:outputText value="Model" />
                                </f:facet>
                                <h:outputText value="#{item.carsettings.model}" />
                            </p:column>
                            <p:column sortBy="#{item.carsettings.manufacturer}" filterBy="#{item.carsettings.manufacturer}">
                                <f:facet name="header">
                                    <h:outputText value="Manufacturer" />
                                </f:facet>
                                <h:outputText value="#{item.carsettings.manufacturer}" />
                            </p:column>
                        </p:dataTable>
                    </h:form>
                </center>
            </f:view>
        </ui:define>
    </ui:composition>
</h:body>

Сортировка не работает в приведенном выше коде

Пожалуйста, помогите

Ответ 1

Мой опыт заключается в том, что поддержка подстроки bean (ViewScoped!) должна содержать собственный список строк. Так, например, если вы запрашиваете базу данных каждый раз, когда вы запрашиваете сортировку p:dataTable:value, она не будет работать. Решение. Соберите список из базы данных и сохраните его в локальной переменной List в резервной копии bean.

public List<Row> getDataTable() {
    if (tableDataList == null)
        tableDataList = loadListOnce();
    return tableDataList;
}

Ответ 2

Проблема:

<f:event type="preRenderView" listener="#{MyBackingBean.load}"></f:event>

Сортировка выполняется с помощью <p:dataTable/> at PhaseId.APPLY_REQUEST_VALUES в списке, а <f:event type"preRenderView"/> вы перезагружаете список в PhaseId.RENDER_RESPONSE, и поэтому вы потеряли сортировку.

Решение: используйте <f:event type="postAddToView"/>

<f:event type="postAddToView" listener="#{MyBackingBean.load}" />

Это приведет к перезагрузке списка на этапе PhaseId.RESTORE_VIEW, прежде чем сортировка выполняется с помощью <p:dataTable/>.

Протестировано с помощью PrimeFaces версии 3.1.1 и Mojarra 2.1.8

Ответ 3

Если вы заполняете таблицу в сортировке получателя (как описано выше). Вы должны ввести свой геттер, например:

public List<Row> getTableData() {
    if (tableDataList == null)
        tableDataList = dao.getTableData();
    return tableDataList;
}

Затем вы можете reset (обновить) свои "наличные", набрав tableDataList = null; если вы не обновите данные.

Ответ 4

У моей службы было:

public List<PlayerEntity> getAllPlayers() {
    return playerDao.readAll();
}

но это было неправильно, потому что когда я вызывал getAllPlayers() из таблицы

<p:dataTable id="data" value="#{myBean.allPlayers}"/>

Я получил данные DAO, но все еще неупорядочен. Вместо этого я создал поле и метод List для обновления списка

private List<PlayerEntity> allPlayers = new ArrayList<PlayerEntity>();  

public void updateAllPlayers(){
    this.allPlayers = playerDao.readAll();
}

какой метод я запускаю в bean инициализации

public void setPlayerDao(PlayerDao playerDao) {
    this.playerDao = playerDao;
    updateAllPlayers();
}

и после добавления, удаления или изменения списка

public boolean createPlayer(PlayerEntity playerEntity) {
    (...)
    updateAllPlayers();
    return true;
}

Теперь моя служба имеет

public List<PlayerEntity> getAllPlayers() {
    return this.allPlayers;
}

и это решило мою проблему с сортировкой данных в таблице Primefaces.

Ответ 5

У меня была проблема сортировки, когда моя поддержка bean была sessionScoped. Не знаете, какова ваша конкретная проблема, но если вы нажмете кнопку сортировки и ничего не произойдет, попробуйте изменить область действия на @ViewScoped.

Ответ 6

Вы пробовали @SessionScoped? он отлично работает для меня, надеюсь эта помощь.

Ответ 7

Я не знаю, ваше дело. Там проблема с разделами. Ошибка в виде datatable. Посмотрите здесь: https://code.google.com/archive/p/primefaces/issues/2476

Есть некоторые обходные пути:

  • вы можете использовать lazyDataModel для вашего datatable, он работает.

  • вы можете принудительно упорядочить порядок сортировки.

В вашем datatable catch событие сортировки

<p:dataTable style="width: 60%" id="dt1" value="#{bean.list}" var="entry" first="0" paginator="true" rows="10" paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}" rowsPerPageTemplate="5,10,15" emptyMessage="No cars found with given criteria" >
<p:ajax event="sort" listener="#bean.sortListener}" />

В вашем управляемом bean вы задаете порядок по строке, чтобы добавить к вашему запросу

private String orderBy = "";

public void sortListener(SortEvent event) {
    String orderColumn = event.getSortColumn().getValueExpression("sortBy").getExpressionString();

    //you will get the content of the attribute SortBy of the column you clicked on, like #{entry.carno}
    orderColumn = orderColumn.replace("#{entry.", "");
    orderColumn = orderColumn.replace("}", "");
    orderBy = " order by " + orderColumn + (event.isAscending()? " asc " : " desc ");
}

public List<Car> getList(){
    String query = "[...your query...]" + orderBy;
    ...[execute your query and get your ordered list]
}