Sorting is not working in datatable in PrimeFaces?

43,232

Solution 1

The primefaces backing bean (ViewScoped!) must hold it's own List of rows. So, e.g., if you query the database every time you request the p:dataTable:value, sorting will not work.

Solution: Collect the List from the Database and keep it in a local List variable in the backing bean.

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

Solution 2

The Problem is:

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

Sorting is done by the <p:dataTable/> at PhaseId.APPLY_REQUEST_VALUES on the list, with the <f:event type"preRenderView"/> you reload the list at PhaseId.RENDER_RESPONSE and so you lost the sorting.

Solution: use <f:event type="postAddToView"/>

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

This will reload the list at PhaseId.RESTORE_VIEW before sorting is done by <p:dataTable/>.

Tested with PrimeFaces Version 3.1.1 and Mojarra 2.1.8

Solution 3

If you populate your table in the getter sorting wont work (as described above). You should put in your getter like:

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

You can then reset(refresh) your "cash" by punting tableDataList = null; if you wont your datatabele refreshed.

Solution 4

My Service had:

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

but that was wrong, because when I was calling getAllPlayers() from table

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

I got from DAO refreshed data but still unordered. Instead of that I've created List field and method to update the List

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

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

which method I'm running on bean initialization

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

and after Add, Delete or Modiffy the List

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

Now my Service has

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

and that solved my problem with sorting data in Primefaces table.

Solution 5

I had a problem sorting when my backing bean was sessionScoped. Not sure what your exact problem is, but if you hit the sort button and nothing happens, try changing your scope to @ViewScoped.

Share:
43,232
user617966
Author by

user617966

Updated on October 16, 2020

Comments

  • user617966
    user617966 over 3 years

    Sorting is not working in datatable in PrimeFaces. Please suggest.

    See below my .xhtml file

    <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

    Look below code

    List of Cars

        <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>
    

    Sorting is not working in the above code

    Please help

  • user617966
    user617966 about 13 years
    No, Sean. I have tried changing my backing bean to @ViewScoped but no results. When I hit the sort icon nothing happens. Any suggestions.
  • Sean
    Sean about 13 years
    I would need to see more of your code. From what you posted it seems like it should work. If you don't find an answer here you should also try the PrimeFaces support forum.
  • Einar
    Einar about 13 years
    This solved my problem, thanks. I hope it solves the OP's problem as well.
  • Hanynowsky
    Hanynowsky almost 13 years
    Not for me! Neither ViewScoped nor RequestScoped do!
  • kostja
    kostja almost 12 years
    @alfonx Solved my issue. It's a shame th reliance on a backing list is not mentioned anywhere in the PF User's guide.
  • Catfish
    Catfish almost 12 years
    This worked great. I was using f:event type="preRenderView" and changing it to postAddToView works awesome! Thanks.
  • Koray Tugay
    Koray Tugay over 10 years
    Where exactly do we put this?
  • Kukeltje
    Kukeltje almost 8 years
    And even then, it is not considered a bug since it is "won't fix" and 5 years old
  • Nice Books
    Nice Books over 7 years
    Adding the if(tableDataList == null) made it work for me. Thanks.
  • Nice Books
    Nice Books over 7 years
    Code example is in bkomac's answer
  • Galilo Galilo
    Galilo Galilo over 3 years
    worked for me, viewscope and sessionscope both worked as expected