A solução que o padrão Repositório oferece é simples. Separa-se a definição da instrução da sua execução. No principio, a ideia era manter o SQL escrito/construido no repositório e passado ao DAO apenas para execução. Isto funcionava em aplicações em que apenas bancos relacionais são usados. Contudo, rapidamente se entendeu que enviar o SQL já pronto não encaixa bem com as diferentes tecnologias de banco de dados pois existem muitos dialectos diferentes. Então recorreu-se ao padrão QueryObject em que um objeto especialmente estruturado para representar a instrução de pesquisa e não uma simples string seria usado. O repositório tem portanto a responsabilidade de montar objetos no padrão QueryObject e enviá-los a um outro objecto capaz de executar essa instrução de pesquisa. Esse outro objecto segue o padrão Interpreter sendo capaz de entender como executar a instrução e retornar as instâncias correspondentes.
Desta forma a verdadeira localização das instâncias e a tecnologia para as acessar é totalmente isolada, não apenas dos pesquisadores das instâncias, mas ainda, do construtor de tais pesquisas. Desta forma ao modificar a tecnologia de acesso e/ou a localização das instancias apenas o interpretador precisa ser modificado.