Accent insensitive Hibernate  XML
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Autor Mensagem
gbvbahia01
Thread.start()
[Avatar]

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

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.
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.
romarcio
JWizard
[Avatar]

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
[WWW]
gbvbahia01
Thread.start()
[Avatar]

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!!!
Kleber-rr
Virtual Machine Man
[Avatar]

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.

febatata
JavaBaby
[Avatar]

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
 
Índice dos Fóruns » Persistência: Hibernate, JPA, JDBC e outros
Ir para:   
Powered by JForum 2.1.8 © JForum Team