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<Produto> BuscaNome(String nome) {
if (nome == null || nome.trim().equals(""))
return (List<Produto>) this.session.createCriteria(Produto.class).list();
return (List<Produto>) 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<Produto> BuscaNome(String nome) {
if (nome == null || nome.trim().equals(""))
return (List<Produto>) this.session.createCriteria(Produto.class).list();
return (List<Produto>) 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
Não querendo abusar, mais porque além da comparação nome == null você usou o trim().equals("")?
[quote=FerTriPa][quote=Lavieri]public List<Produto> BuscaNome(String nome) {
if (nome == null || nome.trim().equals(""))
return (List<Produto>) this.session.createCriteria(Produto.class).list();
return (List<Produto>) 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
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
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