Implementei recentemente um filtro para um relatorio que contem cerca de 7 parametros diferentes. Para implementar esse filtro, gerei o codigo sql da query de acordo com a existencia (ou não) dos parametros passados pelo usuário.
Funciona ótimamente mas eu achei um tanto quando deselegante fazer dessa maneira, então fiz outra implementação onde uma query puxa tudo o que o usuário pode visualizar e depois filtra programaticamente. Ficou muito mais elegante mas acredito que num futuro proximo, quando existirem muitos registros no banco de dados, ficara muito custoso carregar tudo o que o usuário pode ver para depois filtrar.
Alguem ja teve algum problema parecido? Quais as opções para solucionar isso?
Creio que com JPA eu possa implementar algo mais elegante, mas o sistema ja foi construido todo com queries SQL e será muito trabalhoso migrar tudo para JPA.
A primeira solução (gerar código SQL específico de acordo com os parâmetros), apesar de conceitualmente ser menos elegante, tem um desempenho bem melhor, já que o trabalho de filtrar os dados fica a cargo do servidor de BD, e não da sua aplicação. Filtrar via programação certamente trará problemas de lentidão e alto consumo de memória quando sua tabela tiver algumas dezenas de milhares de registros.
Para quem usa Hibernate, uma maneira elegante de resolver esse problema é através da API Criteria. O JPA 2 terá suporte a Criteria, então pode ser interessante avaliar isso também.
Esse lance de buscar tudo e filtrar via código é furada mesmo. Você tem razão em se preocupar com o futuro próximo, quantidade de registros e memória que seu sistema vai consumir.
Assim a melhor opção mesmo é montar sua query com base nos parâmetros passados. Você pode melhorar criando uma estrutura de classes estilo JPA para criação de suas queries, mas neste caso teria que avaliar qual seria mais trabalhoso, migrar tudo para JPA ou escrever esse montador de queries.