Olá, acho que é quase unanimidade que essa criteria do JPA é bem verbosa e chata, mas também é unanimidade que ficar concatenando String para fazer queries dinâmicas também é bem chato. Para tentar escapar dessas situações eu , eu utilizo uma solução baseada em HashMap para passar os parâmetros para a querie, segue um trecho do meu repositório de estabelecimentos:
public List<Estabelecimento> pesquisar(String nome,Long segmentoId){
HashMap<String, Object> params = new HashMap<>();
StringBuffer hql = new StringBuffer("select new br.com.tropicalshoping.modelos.Estabelecimento(e.estabelecimentoId,e.nome,e.logo) from Estabelecimento e where 1=1 ");
if(nome != null && !nome.isEmpty()){
hql.append("and lower(e.nome) like :nome ");
params.put("nome", "%"+nome.toLowerCase()+"%");
}
if(segmentoId != null){
hql.append("and e.segmento.segmentoId = :segmento ");
params.put("segmento", segmentoId);
}
hql.append(" order by e.nome");
TypedQuery<Estabelecimento> query = em.createQuery(hql.toString(), Estabelecimento.class);
for(Entry<String, Object> entry : params.entrySet()){
query.setParameter(entry.getKey(),entry.getValue());
}
List<Estabelecimento> estabelecimentosList = query.getResultList();
return estabelecimentosList;
}
A solução funciona perfeitamente, porém ao rodar a jvisualvm e fazer um Heap Dump, entre os dois maiores objetos que tenho em mémoria estão relacionados com HashMap, e eu so utilizo HashMap nos meus repositórios para este tipo de consulta. O trecho de código acima apresenta algum problema de vazamento de memória?