DataTable Prime Faces - Paginação

Boa tarde galera.
Estou desenvolvendo uma aplicação em JSF com Primefaces, surgiu a necessidade de fazer uma páginação. Li alguns tuto, mas não foram muito esclarecedores para mim, então resolvi contatar o pessoal daqui para sanar as minhas dúvidas.
Seguinte, estou desenvolvendo a Paginação em cima do componente Datatable.
Exemplo: Tenho 100 registros no meu DB, e quando carregar a minha View, pegar os 20 primeiros desses 100. O usuário clica na página seguinte, carregar do registro 21-40, por exemplo.
Pesquisei na web uma função da Datatable que me retorne o número da página atual do usuário, para dai a partir desta informação, fazer a consulta no DB, carregar para a minha DATAMODEL e retornar para a View o resultado.
O meu problema está ai, não estou conseguindo ( e não descobri até então ) pegar a “página” atual do datatable para fazer essa consulta.
Utilizo JSF, PrimeFaces 3.2 , Hibernate e um Banco de Dados Mysql.

View

   <p:dataTable paginator="true" rows="10" rowsPerPageTemplate="10,20,50,100"
                             value="#{agenciaController.listaAgencia}" var="agenciaBancaria"
                             emptyMessage="Nenhum Agência cadastrada." widgetVar="AgenciaTable"
                             paginatorTemplate="{CurrentPageReport}  {FirstPageLink} {PreviousPageLink} {PageLinks} {NextPageLink} {LastPageLink} {RowsPerPageDropdown}"
                             pageLinks="30">
                    <p:column>
                        <f:facet name="header">
                            Código
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.id}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Agência
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.codigoAgencia}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Mnunicípio
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.municipio}" rendered="#{agenciaBancaria.municipio != null}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            UF
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.uf}" rendered="#{agenciaBancaria.uf != null}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Nome
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.nome}"
                                      rendered="#{agenciaBancaria.nome != null}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            CNPJ
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.cnpj}"
                                      rendered="#{agenciaBancaria.cnpj != null}"/>
                    </p:column>
                    <p:column>
                        <f:facet name="header">
                            Telefone
                        </f:facet>
                        <h:outputText value="#{agenciaBancaria.telefone}"
                                      rendered="#{agenciaBancaria.telefone != null}"/>
                    </p:column>
                </p:dataTable>

Controller (Parte que interessa)

    private DataModel<AgenciaBancariaPaginator> listAgencia;
    private AgenciaBancariaDao agenciaDao = new AgenciaBancariaDao(); 
    @PostConstruct
    public void init() {
        carregaLista();
    }

    private void carregaLista() {
        agenciaDao = new AgenciaBancariaDao();
           listAgencia = agenciaDao.PaginacaoAgenciaBancaria("primeiro registro que quero buscar", 20); // o 20 significa que quero buscar 20 registros por vez
     }


  public DataModel<AgenciaBancariaPaginator> getListaAgencia() {
        return listAgencia;
    }

    public void setListaAgencia(DataModel<AgenciaBancariaPaginator> listaAgencia) {
        this.listAgencia = listaAgencia;
    }

DAO

    public DataModel<AgenciaBancariaPaginator> PaginacaoAgenciaBancaria(int registroInicial, int numeroMaximoRegistro) {
        Criteria criteria = HibernateUtil.getSessionFactory(false, false).openSession().createCriteria(AgenciaBancaria.class);
        criteria.setFirstResult(registroInicial);
        criteria.setMaxResults(numeroMaximoRegistro);
        criteria.createAlias("municipio", "mun");
        ProjectionList projacaoLista = Projections.projectionList();
        projacaoLista.add(Projections.property("id").as("id"));
        projacaoLista.add(Projections.property("nome").as("nome"));
        projacaoLista.add(Projections.property("codigoAgencia").as("codigoAgencia"));
        projacaoLista.add(Projections.property("cnpj").as("cnpj"));
        projacaoLista.add(Projections.property("ddd").as("ddd"));
        projacaoLista.add(Projections.property("telefone").as("telefone"));
        projacaoLista.add(Projections.property("mun.nome").as("municipio"));
        projacaoLista.add(Projections.property("mun.uf").as("uf"));
        criteria.setProjection(projacaoLista);
        criteria.add(Restrictions.eq("ativo", true));
        criteria.setResultTransformer(Transformers.aliasToBean(AgenciaBancariaPaginator.class));
        DataModel<AgenciaBancariaPaginator> lista = new ListDataModel<AgenciaBancariaPaginator>(criteria.list());
        HibernateUtil.closeSessionFactory();
        return lista;
    }

Acho que é isso a parte de relevância do Código.
Agradeço a atenção.
Valeu

cara, desculpa eu num entendi pq vc precisa disso. pois vc fazendo o select no banco e montando a lista o datatable ja cuida disso, se nao estou errado!!!

É que assim, meu velho.
Eu queria pegar uma quatidade X de registros por vez ( no caso 20 registros por vez).
Se eu fizer um select com todos os registros da minha base de dados, vai “sobrecarregar” o servidor.
Hoje, faço testes com 100 registros, mas quando tiver de carregar 5000, ai vai ser problema.
Exemplo:
Na primeira página da minha DataTable carrega 1 até o 20.
Quando o usuário clicar na próxima página, ir no banco fazer um select iniciando no registro 21 até o 40, quando clicar na próxima fazer um select iniciando no 41 até o 60.
A primeira ideia que me veio é de “conseguir pegar o resultado da página atual que o usuário está, sabendo essa informação, já tenho ideia de uma cálculo para fazer esse SELECT”.
O que eu não pretendo é fazer um SELECT * FROM AGENCIA_BANCARIA, isso vai “sobrecarregar” a memória do servidor, queria fazer um select do Regitro X até o registro Y, sendo o Y = X + 20.
Não sei se me expressei mal, mas é mais ou menos isso, que queria ver, ou se alguém tiver uma ideia melhor.

Pessoal, eu parando e pensando aqui.
Nunca vai dar certo isso que estou pensando, então ignorem.
Vai dar problema pelo seguinte, eu não vou ter o meu número total de registros nunca para a minha dataTable fazer o paginator corretamente, pois ele faz o paginator baseado no número de rows e de rowsPerPAge que setamos, e sendo que só importarei de 20 em 20, terá somente duas páginas se utilizar 10 rowsPerPage ou uma página só se utilizar 20 ou mais rowPerPage.
Então, esqueçam minha ideia…hhueheuhuehue
Mas estou aceitando dicas.

Então existe modos de fazer isto sim.

Para fazer este tipo de paginação que você deseja EU conheço dois modos, não que não existam mais.
Com o Richfaces tem uma maneira de estender uma classe chamado SerializableDataTable, não tenho certeza do nome dela …

A outra forma eu havia postado recentemente neste tópico.

mas esta última é completamente manual e um pouco trabalhosa, porém lhe atende.

Obrigado, guilhermehkr.
Li o conteúdo do outro tópico, é mais ou menos similar o problema.
Antes eu parei e pensei, e vi que minha ideia era furada.
Com o Richfaces já vi um exemplo,
Li alguns tutoriais de como fazer isso com o Primefaces, utilizando a LazyDataModel.
Estou atualmente na compreensão desses códigos e tentando implementar uma projetinho de teste aqui para então colocar no projeto original…
Mas o tópico segue aberto até a conclusão disso.
Quando eu acabar posto o resultado final aqui para, talvez, ajudar alguém que se encontra ou futuramente se encontrará no mesmo problema.