| Autor |
Mensagem |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2010 15:16:35
|
gbvbahia01
Thread.start()
![[Avatar]](/images/avatar/e14122cd6a12903e0fed829048b1769e.jpg)
Membro desde: 21/08/2008 22:24:13
Mensagens: 41
Offline
|
Trabalhamos em minha empresa com Oracle e Postgre, necessitava de uma forma de rodar em nossa aplicação uma consulta de busca palavras ignorando acentos e caixa.
O banco de nossos clientes não são padronizados, ou seja, temos bancos sem controle de caixa e temos banco que gravam somente caixa alta, outros buscam ignorando acentos e outros não ignoram.
Em nosso negócio não temos como opção gravar as palavras sem acentuação.
Por isso a necessidade de realizar buscas de palavras ignorando acentos e caixa.
Passei algumas horas pesquisando e encontrei uma forma que resolveu meu problema e acho que ajudará alguns outros:
Aqui eu recebo a palavra digitada pelo usuário, neste caso "antiá" e a transformo em ANTIA e retorno como parâmetro para parametro
Depois eu crio a seguinte Query:
Onde dsMedicamento é um parâmetro String da classe Medicamento.
Testei tanto no Oracle 10 como no Postgre 8.3 e em ambos tive o resultado correto.
Agora eu tenho uma segunda missão, aqui na empresa utilizamos Criteria para realizar as consultas, e gostaria de ajuda para converter essa Query em Criteria.
Alguém pode me dar um help?
This message was edited 2 times. Last update was at 16/07/2010 15:19:24
|
|
|
 |
|
|
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2010 17:26:15
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Não há um padrão para todos os bancos, mas no MySQL as consultas com like ignoram acentos e cases. Já no PostgreSQL você pode usar ilike para ignorar o case, porém as buscas consideram acentos. Já no Oracle não existe ilike e ele considera acentos nas buscas.
Usando o criteria do Hibernate você pode usar o ILIKE para fazer as buscas independente do case, porém para acentos não tem. Mas cabe lembrar que qualquer function que você escrever no HQL e não for padrão o Hibernate simplesmente envia o comando para o banco resolver. Mas no criteria não lembro se dá para colocar funções customizadas.
Uma sugestão, aí depende se você pode ou não fazer isso no seu projeto, é usar o Lucene integrado ao Hibernate Search. Buscas complexa no banco de dados às vezes são complexas, como é seu caso. O Hibernate Search te permite fazer alguma coisa mais inteligente e até mais rápida que consultas complexas no banco.
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2010 17:28:13
|
garcia-jj
JWizard
Membro desde: 13/04/2009 22:11:50
Mensagens: 2715
Localização: Porto Alegre
Offline
|
Ahh, outra sugestão é usar soundex. Você pode criar uma coluna de cache para o soundex do nome do remédio na inclusão do medicamento. Quando você precisar pesquisar pode usar algo como:
|
http://github.com/garcia-jj
Não respondo dúvidas via MP. Use o fórum. |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 16/07/2010 17:41:07
|
romarcio
JWizard
![[Avatar]](/images/avatar/0dc800465c816add16e0b6d63be91f49.jpg)
Membro desde: 17/12/2008 10:05:49
Mensagens: 2434
Localização: Santa Maria/RS
Offline
|
E se vc tentasse colocar essa parte do Translate no: .add(Restrictions.sqlRestriction("(TRANSLATE...))
Eu tentei testar, mas no Mysql que tenho aqui disponivel para teste, ele não aceita o comando TRANSLATE.
|
Bacharel em Sistemas de Informação.
Oracle Certified Professional, Java SE 6 Programmer
Blog | Facebook | Twitter |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 19/07/2010 10:42:44
|
gbvbahia01
Thread.start()
![[Avatar]](/images/avatar/e14122cd6a12903e0fed829048b1769e.jpg)
Membro desde: 21/08/2008 22:24:13
Mensagens: 41
Offline
|
Pessoal, antes de mais nada obrigado pela ajuda...
romarcio wrote:E se vc tentasse colocar essa parte do Translate no: .add(Restrictions.sqlRestriction("(TRANSLATE...))
Eu tentei testar, mas no Mysql que tenho aqui disponivel para teste, ele não aceita o comando TRANSLATE.
Romarcio, sua dica deu certo:
Pena que o nome da coluna não pode ser o parâmetro da classe, mas o nome da coluna na tabela, mas isso não é problema...
Brigadão!!!
|
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 11/08/2010 14:13:36
|
Kleber-rr
Virtual Machine Man
![[Avatar]](/images/avatar/ba3ce9aeca1ef55d67282287b5a4b423.jpeg)
Membro desde: 02/07/2009 12:12:02
Mensagens: 664
Offline
|
Boa Tarde pessoal, td bem??
Como ficaria minha criteria usando o normalizer???
Alguma ajuda??
valeu.
|
 |
|
|
 |
![[Post New]](/templates/default/images/icon_minipost_new.gif) 08/08/2011 09:32:28
|
febatata
JavaBaby
![[Avatar]](/images/avatar/a65eb348fb03103dcd48530b52b996a7.jpg)
Membro desde: 13/09/2006 15:17:49
Mensagens: 84
Localização: São Caetano do Sul - SP
Offline
|
Fantástico. Essa dica me ajudou bastante.
Obrigado a todos!
|
Felipe Z. Affonso - Batata |
|
|
 |
|
|