Ignorando case sensitive e acentuação no Java
Autor: Eduardo Monteiro de Andrade | Publicado: 2014-01-03T11:01:00-08:00


Boa tarde pessoal, quanto tempo né?!

Estou passando por um período de correria, então estou sem tempo de postar no blog.

Mas vai ai uma sugestão que poupou algumas horas do meu trabalho.
Estava com um problema no sistema onde estou trabalhando, era na hora de executar qualquer consulta do sistema, ele não buscava os resultados quando usávamos letras maiúsculas e acentuação, passou pela minha cabeça em criar uma função em cada componente de pesquisa para retirar acentos e maiúsculas, mas achei meio tosco essa solução e bem trabalhosa, por que teria que mexer no sistema todo, então coloquei a caixola pra pensar mais e eu sabia que havia uma solução mais limpa, pedi ajuda para para o nosso arquiteto (Anderson Junqueira) e ele me disse que tinha como criar uma solução mais simples e bem melhor, ao invés de adotar a solução anterior para cada componente eu criei um classe que na hora que ele abre a conexão com o banco (ORACLE), ele roda um script que faz todo esse trabalho, olha o código abaixo como ficou:

import java.sql.Connection;
import java.sql.SQLException;

import org.eclipse.persistence.internal.databaseaccess.DatabaseAccessor;
import org.eclipse.persistence.sessions.SessionEvent;
import org.eclipse.persistence.sessions.SessionEventAdapter;

&nbsp; /**
&nbsp; &nbsp;* @author Eduardo Monteiro
&nbsp; &nbsp;* @since 17/12/2013
&nbsp; &nbsp;*/
&nbsp; public class DBSessionListener extends SessionEventAdapter {

&nbsp; public DBSessionListener() {
&nbsp; &nbsp; super();
&nbsp; }

&nbsp; /**
&nbsp; &nbsp;* Método criado para desconsiderar acentuação e letras maiúsculas,
&nbsp; &nbsp;* após abrir a conexão com o banco de dados.
&nbsp; &nbsp;* @param event
&nbsp; &nbsp;*/
&nbsp; @Override
&nbsp; public void postAcquireConnection(SessionEvent event) {
&nbsp; 
&nbsp; &nbsp; Connection conn = ((DatabaseAccessor)event.getResult()).getConnection();
&nbsp; 
&nbsp; &nbsp; try {
&nbsp; &nbsp; &nbsp; conn.createStatement().executeUpdate("alter session set NLS_COMP=LINGUISTIC");
&nbsp; &nbsp; &nbsp; conn.createStatement().executeUpdate("alter session set NLS_SORT=BINARY_AI");
&nbsp; &nbsp; 
&nbsp; &nbsp; } catch(SQLException ex) {
&nbsp; &nbsp; &nbsp; ex.printStackTrace();
&nbsp; &nbsp; }
&nbsp; }
}

Ótimo, agora configurei no persistence.xml que fica dentro do META-INF do projeto, e ficou dessa forma:


&lt;?xml&nbsp;version="1.0" encoding="windows-1252"
&nbsp;?&gt;

&lt;persistence&nbsp;xmlns="http://java.sun.com/xml/ns/persistence"&nbsp;

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; xsi:schemaLocation="http://java.sun.com/xml/ns/persistence
http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"

&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; version="1.0"&gt;

&nbsp; &lt;persistence-unit name="NOMEDOPERSISTENCE-UNIT"&gt;

&nbsp; &nbsp; &lt;provider&gt;org.eclipse.persistence.jpa.PersistenceProvider&lt;/provider&gt;

&nbsp; &nbsp;

&nbsp; &nbsp;RETIREI
AS ENTIDADES PARA O EXEMPLO NÃO FICAR GRANDE

&nbsp; &nbsp;&nbsp;

&lt;properties&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.target-database" value="Oracle11"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.id-validation" value="NULL"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.logging.level" value="OFF"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.cache.shared.default" value="false"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.query-results-cache" value="false"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.jdbc.sequence-connection-pool.initial"
value="1"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.jdbc.sequence-connection-pool.max" value="1"/&gt;

&nbsp; &nbsp; &nbsp; &lt;property name="eclipselink.session-event-listener" value="model.dao.DBSessionListener"/&gt;

&nbsp; &nbsp; &lt;/properties&gt;

&nbsp; &lt;/persistence-unit&gt;


&lt;/persistence&gt;

Só lembrando que essa solução foi adotada para o ORACLE, cada SGBD tem a sua função, mas o processo é o mesmo.