1 Reply Latest reply on Feb 20, 2007 8:01 PM by dsmith1

    EntityQuery ajax pagination

      Has anyone gotten EntityQuery to work with AJAX pagination? Right now the only way I can get it to work is by putting the EntityQuery component in CONVERSATION scope.

      When it isn't in CONVERSATION scope it will not work properly. I can page forward through the list and back through list. But after I leave the first page I can't ever go back to it using repeated clicks of "Previous Page" or clicking "First Page" Also, I can not access the last page of the list though repeated clicking of "Next Page" or clicking "Last Page"

      In both the First Page and Last Page not displaying, I can tell from the debug statements that the query is getting executed with the correct firstResult and returning the correct data. But the page does not update.

      I don't see why I'd have to put the EntityQuery into CONVERSATION scope

      non working example

      components.xml
      -------------------

      <framework:entity-query name="testCodeListQuery" ejbql="select c from TestCode c" max-results="5"/>
      


      view.xhtml
      -------------
      <div id="register"><h:form id="testCodes"
       styleClass="register">
       <h:dataTable id="codeList" var="code" value="#{testCodeList.resultList}">
       <h:column>
       <f:facet name="header">
       <h:outputText value="Code" />
       </f:facet>
       <h:outputText value="#{code.name}"/>
       </h:column>
       <h:column>
       <f:facet name="header">
       <h:outputText value="Desc" />
       </f:facet>
       <h:outputText value="#{code.desc}"/>
       </h:column>
       </h:dataTable>
       <a:commandButton value="First Page" reRender="testCodes" disabled="#{!testCodeList.previousExists}">
       <a:actionparam name="firstResult" value="0"/>
       </a:commandButton>
       <a:commandButton value="Previous Page" reRender="testCodes" disabled="#{!testCodeList.previousExists}">
       <a:actionparam name="firstResult" value="#{testCodeList.previousFirstResult}"/>
       </a:commandButton>
       <a:commandButton value="Next Page" reRender="testCodes" disabled="#{!testCodeList.nextExists}">
       <a:actionparam name="firstResult" value="#{testCodeList.nextFirstResult}"/>
       </a:commandButton>
       <a:commandButton value="Last Page" reRender="testCodes" disabled="#{!testCodeList.nextExists}">
       <a:actionparam name="firstResult" value="#{testCodeList.lastFirstResult}"/>
       </a:commandButton>
      
      </h:form></div>
      


      Paging Bean
      --------------
      @Name("testCodePaginatior")
      public class TestCodePaginatior implements Serializable {
      
       @Logger
       private Log log;
      
       @In("#{testCodeListQuery}")
       private EntityQuery testCodeListQuery;
      
       @Out
       private EntityQuery testCodeList;
      
       @RequestParameter("firstResult")
       private Integer firstResult;
      
       @Factory("testCodeList")
       public void init() {
       this.testCodeList = testCodeListQuery;
       int index = 0;
       if(this.firstResult != null){
       index = firstResult;
       }
       testCodeList.setFirstResult(index);
       log.debug("paging '#0' with firstResult = '#1'",this.testCodeList, this.firstResult);
       }
      }
      


      working example, but conversation scope

      Paging Bean
      --------------
      @Name("testCodePaginatior")
      public class TestCodePaginatior implements Serializable {
      
       @Logger
       private Log log;
      
       @In("#{testCodeListQuery}")
       private EntityQuery testCodeListQuery;
      
       @In(required=false)@Out(scope=ScopeType.CONVERSATION)
       private EntityQuery testCodeList;
      
       @RequestParameter("firstResult")
       private Integer firstResult;
      
       public void page(){
       log.debug("paging '#0' with firstResult = '#1'",this.testCodeList, this.firstResult);
       int index = 0;
       if(this.firstResult != null){
       index = firstResult;
       }
       testCodeList.setFirstResult(index);
       testCodeList.refresh();
       }
      
       @Factory("testCodeList")
       public void init() {
       this.testCodeList = testCodeListQuery;
       int index = 0;
       if(this.firstResult != null){
       index = firstResult;
       }
       testCodeList.setFirstResult(index);
       log.debug("initing '#0' with firstResult = '#1'",this.testCodeList, this.firstResult);
       }
      


      view.xhtml
      -------------
      <div id="register"><h:form id="testCodes"
       styleClass="register">
       <h:dataTable id="codeList" var="code" value="#{testCodeList.resultList}">
       <h:column>
       <f:facet name="header">
       <h:outputText value="Code" />
       </f:facet>
       <h:outputText value="#{code.name}"/>
       </h:column>
       <h:column>
       <f:facet name="header">
       <h:outputText value="Desc" />
       </f:facet>
       <h:outputText value="#{code.desc}"/>
       </h:column>
       </h:dataTable>
      
       <a:commandButton value="First Page" action="#{testCodePaginatior.page}" reRender="testCodes" disabled="#{!testCodeList.previousExists}">
       <a:actionparam name="firstResult" value="0"/>
       </a:commandButton>
       <a:commandButton value="Previous Page" action="#{testCodePaginatior.page}" reRender="testCodes" disabled="#{!testCodeList.previousExists}">
       <a:actionparam name="firstResult" value="#{testCodeList.previousFirstResult}"/>
       </a:commandButton>
       <a:commandButton value="Next Page" action="#{testCodePaginatior.page}" reRender="testCodes" disabled="#{!testCodeList.nextExists}">
       <a:actionparam name="firstResult" value="#{testCodeList.nextFirstResult}"/>
       </a:commandButton>
       <a:commandButton value="Last Page" action="#{testCodePaginatior.page}" reRender="testCodes" disabled="#{!testCodeList.nextExists}">
       <a:actionparam name="firstResult" value="#{testCodeList.lastFirstResult}"/>
       </a:commandButton>
      
      </h:form></div>
      


        • 1. Re: EntityQuery ajax pagination

          Pagination also works when the Query is put in PAGE scope as well.

          After some more debugging, via firebug, I noticed that the ajax response isn't returning the updated table elements when accessing the first and last pages. It just returns the JSF tree (client side state saving)

          Has anyone else run into this problems?

          Thanks in advance