[Resolvido] could not locate named parameter

Olá pessoal. Procurei em vários outros tópicos a possível solução para o meu problema mas não obtive êxito, por isso o motivo da criação do novo tópico.

O erro (could not locate named parameter) quando a condição satisfaz o parâmetro nomeFantasia. Alguém poderia ajudar?

Abaixo o código da consulta e o da entidade

[code]public List pesquisarPorParametros(String nomeFantasia, String razaoSocial, String cnpjMatriz) {
String sql = “SELECT c FROM Cliente c WHERE 1=1”;
TypedQuery query = super.manager.createQuery(sql, Cliente.class);

	if (!nomeFantasia.equals("")) {
		sql += " AND c.nomeFantasia LIKE:nomeFantasia";
		query = query.setParameter("nomeFantasia", nomeFantasia);
		
	}
	if (!razaoSocial.equals("")) {
		sql += " AND c.razaoSocial LIKE:razaoSocial";
		query = query.setParameter("razaoSocial", "%" + razaoSocial + "%");
	}
	if (!razaoSocial.equals("")) {
		sql += " AND c.cnpjMatriz LIKE:cnpjMatriz";
		query = query.setParameter("cnpjMatriz", "%" + cnpjMatriz + "%");
	}

	return query.getResultList();
}[/code]

Minha entidade

import java.util.Date;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Column;
import javax.persistence.ElementCollection;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.OneToMany;
import javax.persistence.OneToOne;
import javax.persistence.Table;
import javax.persistence.Temporal;
import javax.persistence.TemporalType;

import br.com.caelum.stella.bean.validation.CNPJ;
import br.com.pactotecnologia.enumeration.NivelSatisfacaoEnum;

@Entity
@Table(name = "cliente")
public class Cliente {
		
	@Id @GeneratedValue(strategy=GenerationType.IDENTITY)
	private Long id;

	@Column
	private String nomeFantasia;
	
	@Column
	private String razaoSocial;
	
	@OneToOne(cascade = CascadeType.ALL)
	@JoinColumn
	private PessoaJuridica responsavelLegal;
	
	@OneToOne
	@JoinColumn
	private Endereco endereco;	

	@CNPJ
	private String cnpjMatriz;

	@ElementCollection(fetch=FetchType.EAGER)
	private List<String> emails;
	
	@OneToMany(cascade = CascadeType.ALL)
	private List<Telefone> telefones;
	
	@Column
	private boolean ativo;
	
	@Temporal(TemporalType.DATE)	
	private Date dataProximoAtendimento;
	
	@Enumerated(EnumType.STRING)
	private NivelSatisfacaoEnum nivelSatisfacao;
	
	public Long getId() {
		return id;
	}

	public void setId(Long id) {
		this.id = id;
	}

	public PessoaJuridica getResponsavelLegal() {
		return responsavelLegal;
	}

	public void setResponsavelLegal(PessoaJuridica responsavelLegal) {
		this.responsavelLegal = responsavelLegal;
	}

	public String getRazaoSocial() {
		return razaoSocial;
	}

	public void setRazaoSocial(String razaoSocial) {
		this.razaoSocial = razaoSocial;
	}

	public String getNomeFantasia() {
		return nomeFantasia;
	}

	public void setNomeFantasia(String nomeFantasia) {
		this.nomeFantasia = nomeFantasia;
	}
	
	public boolean isAtivo() {
		return ativo;
	}

	public void setAtivo(boolean ativo) {
		this.ativo = ativo;
	}

	public boolean equals(Cliente outroCliente) {
		if(outroCliente.getId().equals(this.id)){
			return true;
		}		
		return false;
	}

	public void addEmail(String email) {
		this.emails.add(email);
	}
	
	public void excluirEmail(String email){
		this.emails.remove(email);
	}
	
	public void addTelefone(Telefone telefone){
		this.telefones.add(telefone);
	}

	public List<String> getEmails() {
		return emails;
	}

	public void setEmails(List<String> emails) {
		this.emails = emails;
	}

	public List<Telefone> getTelefones() {
		return telefones;
	}

	public void setTelefones(List<Telefone> telefones) {
		this.telefones = telefones;
	}

	public String getCnpjMatriz() {
		return cnpjMatriz;
	}

	public void setCnpjMatriz(String cnpjMatriz) {
		this.cnpjMatriz = cnpjMatriz;
	}

	public Endereco getEndereco() {
		return endereco;
	}

	public void setEndereco(Endereco endereco) {
		this.endereco = endereco;
	}

	public Date getDataProximoAtendimento() {
		return dataProximoAtendimento;
	}

	public void setDataProximoAtendimento(Date dataProximoAtendimento) {
		this.dataProximoAtendimento = dataProximoAtendimento;
	}

	public NivelSatisfacaoEnum getNivelSatisfacao() {
		return nivelSatisfacao;
	}

	public void setNivelSatisfacao(NivelSatisfacaoEnum nivelSatisfacao) {
		this.nivelSatisfacao = nivelSatisfacao;
	}

	public void excluirTelefone(Telefone telefone) {
		this.telefones.remove(telefone);		
	}
		
}

Faça o setParameter por último.

O teste que estou fazendo só satisfaz a primeira condição do método, portanto o setParameter ta sendo a última linha de código a ser executada antes da chamada da pesquisa. Mesmo assim fiz o que vc disse e deu no mesmo.

O erro gerado é o seguinte:

Caused by: org.hibernate.QueryParameterException: could not locate named parameter [nomeFantasia]
at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:100)
at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:106)
at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:466)
at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:436)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:367)
… 67 more

O teste que estou fazendo só satisfaz a primeira condição do método, portanto o setParameter ta sendo a última linha de código a ser executada antes da chamada da pesquisa. Mesmo assim fiz o que vc disse e deu no mesmo.

O erro gerado é o seguinte:

Caused by: org.hibernate.QueryParameterException: could not locate named parameter [nomeFantasia]
at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterDescriptor(ParameterMetadata.java:100)
at org.hibernate.engine.query.spi.ParameterMetadata.getNamedParameterExpectedType(ParameterMetadata.java:106)
at org.hibernate.internal.AbstractQueryImpl.determineType(AbstractQueryImpl.java:466)
at org.hibernate.internal.AbstractQueryImpl.setParameter(AbstractQueryImpl.java:436)
at org.hibernate.ejb.QueryImpl.setParameter(QueryImpl.java:367)
… 67 more[/quote]Você tem que fazer o seguinte.
adiciona todos os parametros, cria o objeto query e depois você faz o setParameter.

Isso acontece pq ele não ta encontrando o parâmetro.

Além do mais é que, minha consulta sem parâmetros funciona normal. Não consigo entender o por quê disso.

[quote=Fernando Mateus]Além do mais é que, minha consulta sem parâmetros funciona normal. Não consigo entender o por quê disso.[/quote]Problema de programação.
você tem que adicionar os :algumaCoisa e depois gerar a query e depois fazer o setParameter.

Ele não esta encontrando o parâmetro, só isso.

Pow cara, obrigado pela ajuda.

O problema era esse mesmo.

Imaginava que a query poderia ser criada antes da definição exata da String que contém o SQL.