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:
String parametro = Normalizer.normalize("antiá", Normalizer.Form.NFD).replaceAll("[^\\p{ASCII}]", "").toUpperCase();
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:
String query = " FROM Medicamento cm WHERE upper(TRANSLATE(cm.dsMedicamento,'ÀÁáàÉÈéèÍíÓóÒòÚú','AAaaEEeeIiOoOoUu')) LIKE '" + parametro + "%'";
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?