SQL, HQL ou Criteria API?

Estava aqui no trabalho resolvendo uns bugs de códigos legados e percebi um fato curioso: há alguns DAO‘s usam SQL, outros HQL e outros Criteria. Como todo código onde dezenas de pessoas de diferentes níveis de conhecimento meteram a mão, não há nada em comum e nenhum critério foi adotado para selecionar uma ou outra opção. Vou dar minha opinião a respeito.

SQL

Há trechos de código usando SQL mesmo numa aplicação que usa JPA. Achei estranho. A forma mais prática seria usar JPA, mas as pessoas têm diferentes formações. Certamente um novato se sente mais confortável usando SQL e convertendo os objetos como se usasse JDBC. A questão é que não é todo lugar que você precisa recuperar o objeto inteiro. Há relatórios que fazem muitas operações e formatações que ficariam ainda mais confusas usando HQL ou Criteria. Nesse caso é melhor usar o que a maioria já conhece e consegue entender. A parte chata é fazer operações no ResultSet (ou outra estrutura retornada) e depois retornar os objetos solicitados.

Cuidado com as concatenações nas consultas. Use consulta parametrizada e filtros contra injeção SQL.

HQL

Usar HQL faz mais sentido, uma vez que parece com SQL e retorna objetos, sem a necessidade de fazer operações no ResultSet. Aqui temos algumas operações a menos e deixa bem aberto. Podem haver joins e também seleção de campos específicos. Encontrei erros no sistema por causa disso, pois o esquema tinha alterações não refletidas nas consultas.

Vale o mesmo cuidado da SQL. Existe HQL Injection!

Criteria

É fácil se perder usando essa API. São muitas chamadas de métodos para uma consulta mais complicada. A parte boa: você usa apenas classes e objetos. Não precisa escrever numa segunda linguagem misturada no código Java, mas encadear muitos parâmetros e consultas deixa o código difícil de entender. Use se a busca for simples e sem muitos joins.

Além disso, vale a pena criar um padrão junto com sua equipe e documente isso no código.

Até a próxima!