Erro na pesquisa usando hibernate

7 respostas
marcelo_mococa

fala galera…

é o seguinte…
to tentando usar filtros de pesquisa com hibernate,a traves da API Criteria.
Vejam o metodo q fiz no meu DAO:

public List<Cliente> buscaPorNome(String busca){
		Criteria select = session.createCriteria(Cliente.class);
		select.createCriteria("nome").add(Restrictions.ge("nome",busca));
		List<Cliente> resultado = select.list();
		return resultado;
 }

Na minha action, to fazenu assim:

PesquisaClienteForm p = (PesquisaClienteForm)form;
DAO<Cliente> dao = new DAO<Cliente>(Cliente.class);
List<Cliente> clientes = dao.buscaPorNome(p.getNome());
req.setAttribute("clientes", clientes);

minha PesquisaClienteForm:

public class PesquisaClienteForm extends ActionForm{
	
	private String nome;

	public String getNome() {
		return nome;
	}

	public void setNome(String nome) {
		this.nome = nome;
	}

}

preencho o formulario na jsp para realizar a busca, e quando clico em pesquisar, ta dando a seguinte exception:

HTTP Status 500 -

type Exception report

message

description The server encountered an internal error () that prevented it from fulfilling this request.

exception

javax.servlet.ServletException: not an association: nome
	org.apache.struts.action.RequestProcessor.processException(RequestProcessor.java:523)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:421)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

root cause

org.hibernate.QueryException: not an association: nome
	org.hibernate.loader.criteria.CriteriaQueryTranslator.getPathEntityName(CriteriaQueryTranslator.java:198)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.createCriteriaEntityNameMap(CriteriaQueryTranslator.java:175)
	org.hibernate.loader.criteria.CriteriaQueryTranslator.<init>(CriteriaQueryTranslator.java:81)
	org.hibernate.loader.criteria.CriteriaLoader.<init>(CriteriaLoader.java:69)
	org.hibernate.impl.SessionImpl.list(SessionImpl.java:1238)
	org.hibernate.impl.CriteriaImpl.list(CriteriaImpl.java:299)
	br.com.marcelo.hibernate.DAO.buscaPorNome(DAO.java:61)
	br.com.marcelo.action.PesquisaClienteAction.execute(PesquisaClienteAction.java:24)
	org.apache.struts.action.RequestProcessor.processActionPerform(RequestProcessor.java:419)
	org.apache.struts.action.RequestProcessor.process(RequestProcessor.java:224)
	org.apache.struts.action.ActionServlet.process(ActionServlet.java:1194)
	org.apache.struts.action.ActionServlet.doPost(ActionServlet.java:432)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:709)
	javax.servlet.http.HttpServlet.service(HttpServlet.java:802)

note The full stack trace of the root cause is available in the Apache Tomcat/5.5.8 logs.
Apache Tomcat/5.5.8

Alguém pode me ajudar?
Obrigado…

7 Respostas

_fs

O método creteria.createCriteria é para buscas em classes associadas. No seu caso basta fazer:

Criteria select = session.createCriteria(Cliente.class);
select.add(Restrictions.ge( "nome", busca ) );
List&lt;Cliente&gt; resultado = select.list();

Um exemplo para entender melhor o uso de criteria.createCriteria:

Criteria select = session.createCriteria(Cliente.class);
select.createCriteria("enderecos").add(Restrictions.ge("rua",busca));
List&lt;Cliente&gt; resultado = select.list();

class Cliente {
     private List&lt;Endereco&gt; enderecos;
}

class Endereco {
     private String rua;
     private String numero;
     private String bairro;
}

Sacou? :smiley:

marcelo_mococa

valeu Lipe…

era isso mesmo, muito boa tua explicação, simples e precisa…

Valeu mesmo…

marcelo_mococa

Bom, aproveitando tua bao vontade, me de uma ajuda…

e se eu quise colocar neste mesmo formulário a opção de pesquisar por cidade tb.
Dai o usuário vai poder pesquisar só por nome (dai dexa o campo cidade em branco)
só por cidade…
ou pelos dois critérios…

o q devo mudar?
posso usar o mesmo método?como faço este controle?

_fs
Criteria select = session.createCriteria(Cliente.class);

// parametro passado para o metodo
if( buscaPorNome )
    select.add(Restrictions.ge( "nome", nome ) );
if( buscaPorCidade )
    select.add(Restrictions.ge( "cidade", cidade ) );
List&lt;Cliente&gt; resultado = select.list();

Quanto a determinar se é para buscar ou não (parâmetros ‘buscaPorNome’ e ‘buscaPorCidade’) é complicado. Simplemente checar se o parametro é nulo pode não ser suficiente, pois poderia ser exatamente o que o usuário deseja.

marcelo_mococa

vixi…agora q vi um problema

ele naum ta fazenu o filtro direito…
tipo:

tenho 3 clientes cadastrados:
Marcelo
Leonardo
Aline

quando mando buscar por leonardo, aparece o leonardo e o marcelo, rs
quando busco marcelo, aparece só o marcelo
quando busco por aline, aparece os tres, rs…

o q pode estar acontecendo…
obrigado

rodrigo_corinthians

Cara essas dúvidas vc encontra fácil a resposta na documentação oficial.

E respondendo a sua pergunta, já tentou utilizar o método “like”?

Restrictions.like("nome", "%"+busca+"%")

Sem mais, Rodrigo.

marcelo_mococa

ae…

funcionou…

muito obrigado

Criado 4 de agosto de 2005
Ultima resposta 4 de ago. de 2005
Respostas 7
Participantes 3