Hibernate - Buscar pelo nome [RESOLVIDO]

Eu preciso de uma busca feita pelo nome. Obrigando a digitação do nome completo eu consegui:

public List<Produto> BuscaNome(String nome) { return (List<Produto>) this.session.createCriteria(Produto.class).add(Restrictions.eq("nome", nome)).list(); }

Eu preciso que a busca seja feita também quando é digitado apenas um pedaço do nome, ou quando nada é digitado que liste tudo.
Alguma luz? :roll:

public List&lt;Produto&gt; BuscaNome(String nome) { if (nome == null || nome.trim().equals("")) return (List&lt;Produto&gt;) this.session.createCriteria(Produto.class).list(); return (List&lt;Produto&gt;) this.session .createCriteria(Produto.class) .add(Restrictions.ilike("nome", "%"+nome+"%")) .list(); }

ilike quer dizer que ele vai testar se o nome é como o enveido, sem testar o case sensitive… c vc kizer case senstive use like no lugar de ilike…

% é um carcter curinga que quer dizer todos…

ou seja

"%" + nome; //termina com o nome enviado. nome + "%"; //inicia com o nome enviado. "%" + nome + "%"; //comtem o nome enviado.

[quote=Lavieri]public List&lt;Produto&gt; BuscaNome(String nome) { if (nome == null || nome.trim().equals("")) return (List&lt;Produto&gt;) this.session.createCriteria(Produto.class).list(); return (List&lt;Produto&gt;) this.session .createCriteria(Produto.class) .add(Restrictions.ilike("nome", "%"+nome+"%")) .list(); }

ilike quer dizer que ele vai testar se o nome é como o enveido, sem testar o case sensitive… c vc kizer case senstive use like no lugar de ilike…

% é um carcter curinga que quer dizer todos…

ou seja

"%" + nome; //termina com o nome enviado. nome + "%"; //inicia com o nome enviado. "%" + nome + "%"; //comtem o nome enviado.[/quote]
Perfeito :smiley:

Não querendo abusar, mais porque além da comparação nome == null você usou o trim().equals("")?

[quote=FerTriPa][quote=Lavieri]public List&lt;Produto&gt; BuscaNome(String nome) { if (nome == null || nome.trim().equals("")) return (List&lt;Produto&gt;) this.session.createCriteria(Produto.class).list(); return (List&lt;Produto&gt;) this.session .createCriteria(Produto.class) .add(Restrictions.ilike("nome", "%"+nome+"%")) .list(); }

ilike quer dizer que ele vai testar se o nome é como o enveido, sem testar o case sensitive… c vc kizer case senstive use like no lugar de ilike…

% é um carcter curinga que quer dizer todos…

ou seja

"%" + nome; //termina com o nome enviado. nome + "%"; //inicia com o nome enviado. "%" + nome + "%"; //comtem o nome enviado.[/quote]
Perfeito :smiley:

Não querendo abusar, mais porque além da comparação nome == null você usou o trim().equals("")?[/quote]

pq buscaNome(null) … vai retornar tudo… assim como

buscaNome("") vai retornar tudo, pois as vezes vc pede um input e é uma string vazi, ou seja com “”

e o trim, é pq alguem pode dar espaço e digitar enter… assim com o trim ele remove espaços vazio atoa…

buscaNome(" “) tb vai retornar tudo
assim como
bsucaNome(” ")

Entendi!
Obrigado pela ajuda :slight_smile:

Só adicionando…

aqui: .add(Restrictions.ilike(“nome”, “%”+nome+"%"))
poderia usar: .add(Restrictions.ilike(“nome”, nome, MatchMode.ANYWHERE))

o like e o ilike aceitam um terceiro parametro que indica onde a substring deve ser pesquisada
só outra forma de fazer sem escrever os %

tem quatro opcoes… BEGIN, END, EXACT e ANYWHERE