Repositorio com paginação?

Olá pessoal,

Queria um “insight” na seguinte situação (nomes das classes hipotéticos para simplificar): tenho um repositório de itens, que faz uso de um dao para acessar os objetos de uma tabela no banco de dados e converter os objetos retornados da tabela do banco para outros objetos de interesse para meu domínio. O DAO faz uso da JPA para mapear os registros do banco em objetos (ver código abaixo).

Agora, supondo que eu tenha milhões de registros no banco, esse código iria rapidamente incorrer num OutOfMemoryError. Uma saída seria utilizar paginação no DAO. Mas aí a interface do repositório também teria que fornecer um método para trabalhar com paginação, tirando a ilusão de que um repositório é “uma lista de objetos em memória”. É isso mesmo? Alguma outra idéia de implementação?

abraços


class RepositorioItens {
   
   // ... código omitido ...
  
   public List<Item> getAllItens() {
      List<ObjetoDoBD> objetosDoBD = dao.getAllObjetoDoBD();
      List<Item> itens = new ArrayList<Item>();
      // código que realiza um "processamento de negócio", convertendo a lista de "objetos do BD" para uma lista de itens
      return itens;
   }
}

class ObjetoDoBDDao {
   public List<ObjetoDoBD> getAllIObjetosDoBD() {
      return entityManager.createQuery("select object(o) from ObjetoDoBD as o").getResultList());
   }
}



}

Eu prefiro ser prático do que dogmatico… Se não poluir muito, coloca a paginação no Repository mesmo.
Se voce esta falando de Repository você deve estar falando de DDD.
No fim, aplicar DDD é ter um camada de dominio forte que reflete o dominio do negócio. Colocar um método findByXYZ com parâmetros de paginação não vai enfraquecer a sua camada de domínio.

Repositorios vivem no dominio e sao utilizados por oturos objetos de dominio, se paginacao nao é um conceito existente no dominio nao vejo porque ter paginacao no repositorio.

Pensa assim…

Uma consulta, seja por 1 ou 1 milhao de itens, nao produz qualquer efeito observavel no dominio. Soma-se isto ao fato de ser uma demanda que nao sugiu de dentro do dominio logo nao vejo que seja responsabilidade para nenhum de seus objetos, e isto inclui o repositorio…

Na minha opiniao o mais pratico neste caso seria simplesmente o cliente acessar diretamente a persistencia, ignorando completamente o dominio.