Buscar com Like (JPA/Hibernate)

201 views
Skip to first unread message

Éverton Trindade

unread,
Oct 17, 2008, 9:34:32 AM10/17/08
to pb...@googlegroups.com
Ae galera, gostaria de saber se existe alguma forma de burlar o case sensitive do createQuery(hql).getResultlist() quando eu estou tentando fazer um like em 1 texto... ex.:

String hql = "from Empresa where nome like 'Banco%'";
List<?> lista = em.createQuery(hql).getResultlist();

Nesse trecho de exemplo ele me retorna todos os campos da base que iniciem "Banco"... Se Caso eu coloque o 'B' minusculo, não me retorna os mesmos registros... como faço pra pegar os registros sem o case sensitive???

A base que utilizo é Oracle.

Agradeço desde já a ajuda.

--
"Möge Gott Gnade mit meinen Feinden haben, denn ich habe sie nicht" (George S. Patton)
_________________
Éverton Trindade
-
Bel. em Sistemas de Informação
pelas Faculdades Integradas de Patos
-
Desenvolvedor Pleno
Neus Tecnologia da Informação Ltda.
-
LinkedIn Profile [http://www.linkedin.com/in/evertontrindade]
Blog [http://neguinhoetav.wordpress.com]

Éverton Trindade

unread,
Oct 17, 2008, 9:41:57 AM10/17/08
to pb...@googlegroups.com
Galera, consegui fazer utilizando o recurso da base na String.

String hql = "from Empresa where LOWER(nome) like LOWER('Banco%')";

Alguém tem uma solução que se desprenda da solução da base???

2008/10/17 Éverton Trindade <neguin...@gmail.com>

Valdemar Júnior

unread,
Oct 17, 2008, 11:48:19 AM10/17/08
to pb...@googlegroups.com
Acho que a solução seria isso mesmo, acho que não tem problema utilizar a solução da base, já que as functions LOWER e UPPER são funções internas do SQL, se não for acho que não existe um banco que não as implemente.

att,

vjr

2008/10/17 Éverton Trindade <neguin...@gmail.com>



--
Valdemar Júnior
SCJP 5.0, SCWCD1.4, SCBCD 5.0
WebSite: http://www.valdemarjr.net
Mobile: (+55) (19) 9286 2226
Blog: http://valdemarjr.blogspot.com/
-----------------------------------------------

Maurício Linhares

unread,
Oct 17, 2008, 4:04:31 PM10/17/08
to pb...@googlegroups.com
Com JPA eu não sei, mas com Hibernate seria assim:

List cats = session.createCriteria(Cat.class)
.add( Restrictions.ilike("name", "Iz%") )
.list();

Agora, o ideal é deixar o seu banco de dados case insensitive, porque
uma consulta como essa -> "from Empresa where LOWER(nome) like
LOWER('Banco%')" simplesmente ignora qualquer índice que houver no
banco de dados, o que é uma péssima idéia, especialmente quando esse
banco de dados estiver grante.


2008/10/17 Éverton Trindade <neguin...@gmail.com>:
--
Maurício Linhares
http://alinhavado.wordpress.com/ (pt-br) | http://blog.codevader.com/ (en)
João Pessoa, PB, +55 83 8867-7208

berg.pb .

unread,
Oct 17, 2008, 4:41:12 PM10/17/08
to pb...@googlegroups.com
com JPA, usa o NOT LIKE

2008/10/17 Maurício Linhares <mauricio...@gmail.com>

Valdemar Júnior

unread,
Oct 17, 2008, 5:08:03 PM10/17/08
to pb...@googlegroups.com
Não sei com relação aos indices, mas o Restrictions.ilike("name", "Iz%")  do hibernate ele faz um "like" e chamar a função "lower" em background("debaixo dos panos") e ainda faz um value.toString().toLowerCase() no valor. Eu acho que essa função ilike é só pra não ficar a função lower hardcode e diversos outros tratamentos que o hibernate faz, como o Dialect, por exemplo.

2008/10/17 Maurício Linhares <mauricio...@gmail.com>

berg.pb .

unread,
Oct 18, 2008, 7:24:57 AM10/18/08
to pb...@googlegroups.com
Bem, o ILIKE serve para capturar os dados, inpedentes do sensitive deles...

Ex. 1 - LIKE:
SELECT * FROM Pessoas WHERE LIKE 'J%'

vai recuperar todos os nomes que começam com J, porém, que começam com J maiusculo. se tiver uma pessoa cadastrada errada com o nome 'joao', com j minusculo, ele nao recupera.

Ex.2 - ILIKE:
SELECT * FROM Pessoas WHERE ILIKE 'J%'

recupera tudo que começa com J, não importanto a caixa dele.

No caso do JPA, como ele não possui o ILIKE, testamos na aula um dia desses com o NOT LIKE e resolveu...

abraços

Berg
Graduando em Análise e Desenvolvimento de Sistemas
Cefet-PB - Uned Cajazeiras


2008/10/17 Valdemar Júnior <valdema...@gmail.com>

Rafaell Pinheiro

unread,
Oct 18, 2008, 9:29:20 AM10/18/08
to pb...@googlegroups.com
Complementando

A solução mais simples pra esta consulta é com o uso do LOWER no JPA.

por exemplo

Select p from Pessoa p where LOWER(p.nome) LIKE :stringBusca

depois vc seta o parametro a query....

q.setParameter("stringBusca", "%"+stringBusca.toLowerCase()+"%"




2008/10/18 Rafaell Pinheiro <rafa...@gmail.com>
A solução mais simples pra esta consulta é com o uso do LOWER no JPA.

por exemplo

Select p from Pessoa p where LOWER(p.nome) LIKE :stringBusca


Abs..

Rafaell Pinheiro

2008/10/18 berg.pb . <file...@gmail.com>



--
Rafaell Pinheiro Sousa



--
Rafaell Pinheiro Sousa

Rafaell Pinheiro

unread,
Oct 18, 2008, 9:02:38 AM10/18/08
to pb...@googlegroups.com
A solução mais simples pra esta consulta é com o uso do LOWER no JPA.

por exemplo

Select p from Pessoa p where LOWER(p.nome) LIKE :stringBusca


Abs..

Rafaell Pinheiro

2008/10/18 berg.pb . <file...@gmail.com>
Bem, o ILIKE serve para capturar os dados, inpedentes do sensitive deles...






--
Rafaell Pinheiro Sousa
Reply all
Reply to author
Forward
0 new messages