Lazy JSF Datatable Pagination (Primefaces)

Hello, how are you?

Today we will do JSF datatable pagination with a Lazy List with a view scoped managed bean. What all those words/expressions mean?

There are several JSF frameworks today that provide datatables with a ready pagination, columns sorter and others functionalities. Today we will use the Primefaces datatable.

Usually the datatables will put the displayed List, with the entities, inside the user http session. Increasing the objects inside the user session will have a direct impact on the server performance; each user that displays a datatable,  that keeps a list in the session, will be allocating more and more memory in the server.

To look like real life, our post will use JPA and HSQLDB as database, and we will use JPQL to query the data.

In the end of this post you will find the link to download the source code.

We will use:

  • JSF 2.0 – JBoss 7 Implementation
  • JBoss 7.1 – the code of this post should be applied to all servers
  • Eclipse Indigo
  • JPA 2.0 – JBoss 7 Implementation
  • HSQLDB (2.2.8) – The HSQL it is a memory database, it will be easier to run it.
  • Primefaces 3.2

This post is not about good development practices nor about adding classes layers of project modeling. I just intend to show how to do a pagination without a session managed bean.

35 thoughts on “Lazy JSF Datatable Pagination (Primefaces)

    • Hello.

      For some reason there was a little delay in the blog.

      But now is all ok.

      Sorry for the trouble and the late response.

  1. Hi, I am a junior developer, I am very interesting in Primefaces library and JSF 2.0. I say the Primefaces. it have good features and code examples and vidoetutorials, that i permits to learn easy and fast.

    Today, I watch your post, it is very interesting and very good quality. i want to share a videotutorial about DataTable of Primefaces 3.2 with common features to help with the learning of this framework.

    Datatable Primefaces 3.2 with sort, filter, select row with display info,

    I hope not upset with my opinion and leave a list of interesting tutorials of youtube


    • Hello Roger,

      This is a good way to implement a lazy pagination.
      The problem is that the developer looses the JSF auto complete that help a lot on the delopment process.

      Thanks for the link. [=

  2. @Jose Maria:

    hi again , i was able to resolve the above issue, i now show my query in the datatable , but i can only show the first page of my data , when i click another page i got an exception at this line

    return query.getResultList(); (this only works at the first time that i run the page)

    I use EJB and use cdi lookup to have access to my sessionBean from the lazy class .

    and i got this exception
    Caused by: java.lang.NoClassDefFoundError: oracle/jdbc/driver/ResultSetUtil

    it apparently doesnt read the library but dont know why , if at the first time i can execute the query

    any ideas what im doing wrong? Thank you :)

  3. Hi again ,first for the problem that i had it was a missing .jar in glassfish folder this is new since gf 3.1.2,
    in the other hand , i succesufully implemented lazy loading for a big query that i had , now the issue is how to implement a global filter for the datatable knowing that the datatable only has the data for an specific range. have you done this before? any tips for this ? thanks in advance

    Jose Maria.

    • Hello Marco

      Yes, I did not implement the filter because it is very straightforward.

      I talked about how to use it, but I did not put any code to leave the post more simple.

      If you have any doubt about how to use it, you can do System.out.println in the parameters to see the value that is arriving from the view.

      Check the values and use it in the query.

      Thanks for passing by.

  4. hello I have a problem. I made some adjustments in your tutorial
    with respect to the dao

    But it shows me this error

    Grave: Error Rendering View [/ index.xhtml]
    java.lang.ArithmeticException: / by zero
    at org.primefaces.model.LazyDataModel.setRowIndex ( 62)

    say what can I do to remedy this problem.

    from already thank you and congratulations for the tutorial.

    • Hello

      I am sorry but I cannot help you now.

      I do not have free time to look at you code. I would need to check all your code to see where the problem is.

      Post your code/doubt here:

      You will find good people that gives free consulting based on your code.

      Thanks for passing by.

  5. Hello, very nice tutorial, I’m following your web as I’m starting with JavaEE.

    I’d like to ask you about the xhtml page, in the datatable properties, the only way I can retrieve any values is by using the ” lazy = “true” ” property, but you don’t use that in your code. Do you know why? am I forgetting something?

    Thanks in advance and congratulations for your good posts ;)

    • Hello Max,

      The lazy is mandatory for newer primefaces versions. When I created this post it was not necessary to use the attribute lazy.

      Thanks for passing by.

  6. I got the error:

    Out 05, 2014 7:20:48 PM com.sun.faces.renderkit.ClientSideStateHelper doGetState
    GRAVE: Not in GZIP format Not in GZIP format
    at Source)
    at Source)
    at Source)
    at com.sun.faces.renderkit.ClientSideStateHelper.doGetState(
    at com.sun.faces.renderkit.ClientSideStateHelper.getState(
    at com.sun.faces.renderkit.ResponseStateManagerImpl.getState(
    at com.sun.faces.application.view.StateManagementStrategyImpl.restoreView(
    at com.sun.faces.application.StateManagerImpl.restoreView(
    at com.sun.faces.application.view.ViewHandlingStrategy.restoreView(
    at com.sun.faces.application.view.FaceletViewHandlingStrategy.restoreView(
    at com.sun.faces.application.view.MultiViewHandler.restoreView(
    at javax.faces.application.ViewHandlerWrapper.restoreView(
    at com.sun.faces.lifecycle.RestoreViewPhase.execute(
    at com.sun.faces.lifecycle.Phase.doPhase(
    at com.sun.faces.lifecycle.RestoreViewPhase.doPhase(
    at com.sun.faces.lifecycle.LifecycleImpl.execute(
    at javax.faces.webapp.FacesServlet.service(
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(
    at org.apache.tomcat.websocket.server.WsFilter.doFilter(
    at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(
    at org.apache.catalina.core.ApplicationFilterChain.doFilter(
    at org.apache.catalina.core.StandardWrapperValve.invoke(
    at org.apache.catalina.core.StandardContextValve.invoke(
    at org.apache.catalina.authenticator.AuthenticatorBase.invoke(
    at org.apache.catalina.core.StandardHostValve.invoke(
    at org.apache.catalina.valves.ErrorReportValve.invoke(
    at org.apache.catalina.valves.AccessLogValve.invoke(
    at org.apache.catalina.core.StandardEngineValve.invoke(
    at org.apache.catalina.connector.CoyoteAdapter.service(
    at org.apache.coyote.http11.AbstractHttp11Processor.process(
    at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(
    at java.util.concurrent.ThreadPoolExecutor.runWorker(Unknown Source)
    at java.util.concurrent.ThreadPoolExecutor$ Source)
    at org.apache.tomcat.util.threads.TaskThread$
    at Source)

  7. Been having problems understanding Primefaces and your blog worked like magic, now I get it way way better but I do not know how to implement the sort part and filter part of Primefaces and you did not do that here. Any pointer? or maybe update or maybe where I can look?

    Thank you

    • Hello ij.

      First of all, I am really sorry for taking so long in my answer. I am working more than 10h per day in this last month, all days. =(

      I cannot tell you for sure, because I do not know how that Primefaces is implemented in the new version.

      I believe that you could ask in the Primefaces forum

      Thanks for passing by

  8. How can I get current page list of data table. Means If I am on page 2 having 3 rows then how can I get this list of three object in managed bean???? trying from last 3 days. Please help.

    • Hello Pravin, how are you?

      If you list points to ${managedBean.yourList} than yourList alread has the 3 rows. Use the same managedBean.

      Thanks for passing by.

Leave a Comment