Vamos a solução: (pode não ser a melhor, mas acho que atende o seu problema).
Esta classe em anexo tem a inteligencia total da paginacao, a parte mais dificil esta feita.
Objetivo: Você deve apresentar toda as possiveis paginas em tela (atributo numberOfPages do objeto Paginacao) e quando ele clicar em algums dos numeros, você coloque este numero dentro do atributo PAGE do objeto Paginacao.
é simples fazer isto: Você declara esta classe Paginacao como um atributo do seu managedBean e na tela mapeia que algum componente: #{mb.paginacao.page} quando foi feito o submit ou ajax, este valor já estará dentro deste objeto e neste mesmo submit você chamará o método pesquisar o qual irá passar ao service este objeto Paginação que já terá calculado o minResult e maxResult.
Dentro deste service você irá precisar descobrir uma coisa: a quantidade de registros que sua consulta vai retornar! você da um COUNT, passando seus parametros, na tabela e SETA o resultado dentro do objeto paginação, na propriedade totalOfRows.
Dai você faz uma busca dos registro, passando seus parametros. Dai você utiliza aquele DAO que você criou que recebe minResult e maxResult, passando as propriedades getFirstResult e getMaxResult do objeto Paginacao, respectivamente.
Retorna a lista de registros e apresenta em tela.
Existe um atributo do objeto Paginacao, numberOfPages, que terá todas as possiveis páginas (link todos estes numeros para que ao submitar a página ele ENVIE o valor do número da página para o atributo PAGE, o que mencionei acima) . Apresente-o na tela juntamente com seu grupo de registros, quando o usário clicar em um destes números o objeto paginação terá a pagina desejada e irá ter o maxResult e firstResult prontos para seu DAO trazer a quantidade de registros corretamente.
Segue a classe que tem a inteligencia de paginar, ela deve ser trafegada até o DAO para receber o valor do count, como também passar o valor do minResult e maxResult
import java.io.Serializable;
import java.util.LinkedList;
import java.util.List;
public class Paginacao implements Serializable {
private static final long serialVersionUID = -1L;
/**
* Página corrente
*/
private int page = 1;
/**
* Divisor de página.
*/
private Float pageDivisor = (float) 10;
/**
* Total de registros
*/
private Float totalOfRows = 0F;
/**
* List quantidade de páginas
*/
private List<Integer> numberOfPages = new LinkedList<Integer>();
/**
* Retorna o primeiro indice da paginacao
*/
public int getFirstResult(){
int firstResult = (int) ((page-1) * pageDivisor);
return firstResult >= 0 ? firstResult : 0;
}
/**
* Retorna último indice de paginacao
*/
public int getMaxResult(){
return pageDivisor.intValue();
}
public void setTotalOfRows(float totalOfRows) {
this.totalOfRows = totalOfRows;
numberOfPages = new LinkedList<Integer>();
int qtd = ((Double) Math.ceil(this.totalOfRows / pageDivisor)).intValue();
for(int i=1; i<= qtd; i++){
numberOfPages.add(i);
}
}
public void setPageDivisor(int pageDivisor) {
this.pageDivisor = new Float(pageDivisor);
}
public int getPageDivisor() {
return pageDivisor.intValue();
}
public List<Integer> getDivisors(){
List<Integer> lst = new LinkedList<Integer>();
lst.add(5);
lst.add(10);
lst.add(25);
lst.add(50);
lst.add(100);
return lst;
}
public int getTotalOfPages() {
return numberOfPages.size();
}
public int getTotalOfRows() {
return totalOfRows.intValue();
}
public int getPage() {
return page;
}
public void setPage(int page) {
this.page = page;
}
public List<Integer> getNumberOfPages() {
return numberOfPages;
}
}
Acho que isto já lhe dará um LUZ para este problema.