Galera, estou fazendo uma query dinamica, só que estou recebendo o seguinte erro:
could not locate named parameter [el1]
public List<CorretorPessoa> listaCorretores() {
List<CorretorPessoa> listaCorretores = null;
List<String> queryDinamica = new ArrayList<String>();
if(nomeCorretor != null){
queryDinamica.add("result.pessoa.nomePessoa like '%#{nomeCorretor}%'"); // AQUI ELE É A LINHA PROBLEMÁTICA
}
if(creciCorretor != null && creciCorretor.equalsIgnoreCase("")){
queryDinamica.add("result.corretorCreci = #{creciCorretor}");
}
if(classificacaoSelecionada != null){
queryDinamica.add("result.classificacao = #{classificacaoSelecionada}");
this.setValor(true);
}
try {
EntityQuery<CorretorPessoa> entityQuery = new EntityQuery<CorretorPessoa>();
entityQuery.setEntityManager(entityManager);
entityQuery.setEjbql(" FROM CorretorPessoa result");
entityQuery.setRestrictionExpressionStrings(queryDinamica);
listaCorretores = entityQuery.getResultList();
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return listaCorretores;
}
Usando somente o like sem ’ e % funciona, só que quando eu coloco dá o erro mencionado acima.
Ao invés de passar o valor em formato EL (#{nomeCorretor}), você não teria que passar a String?
Já tentei passar uma String, só que dá o seguinte erro:
there should be exactly one value binding in a restriction: org.jboss.seam.core.Expressions$1@425c28
passei dessa forma:
if(nomeCorretor != null){
queryDinamica.add("result.pessoa.nomePessoa like '%"+nomeCorretor+"}%'");
}
Vc deixou uma chave: ‘%"+nomeCorretor+"}%’
Ops, foi erro meu na hora de digitar aki. Mas mesmo assim o erro continua:
if(nomeCorretor != null){
queryDinamica.add("result.pessoa.nomePessoa like '%"+nomeCorretor+"%'");
}
ERRO:
there should be exactly one value binding in a restriction: org.jboss.seam.core.Expressions$1@425c28
Consegui fazer funcionar.
if(nomeProduto != null){
queryDinamica.add("lower(produto.nomeProduto) like concat(lower(#{nomeProduto}),'%')");
}
Só que ele me retorna tudo o que começa com o que é passado. Eu queria que ele me retorna-se tudo que tiver o que foi passado.
Por exemplo:
Bombom recheado de amendoin
Bombom recheado de coco
Bombom recheado de morango
…
Quando digito Bombom ele faz certinho. Traz todos os bomboms, só que quando digito recheado ele não traz nada. O que está faltando?
Ops…
Consegui resolver
if(nomeProduto != null){
queryDinamica.add("lower(produto.nomeProduto) like concat('%',lower(#{nomeProduto}),'%')");
}
Não tinha visto que estava faltando o ‘%’ do lado esquerdo do lower.