sexta-feira, 3 de janeiro de 2014

Ignorando case sensitive e acentuação no Java


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;

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

  public DBSessionListener() {
    super();
  }

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

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

<?xml version="1.0" encoding="windows-1252"  ?>
<persistence xmlns="http://java.sun.com/xml/ns/persistence" 
                        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
                        xsi:schemaLocation="http://java.sun.com/xml/ns/persistence http://java.sun.com/xml/ns/persistence/persistence_1_0.xsd"
                        version="1.0">
  <persistence-unit name="NOMEDOPERSISTENCE-UNIT">
    <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider>
   
   RETIREI AS ENTIDADES PARA O EXEMPLO NÃO FICAR GRANDE
    
<properties>
      <property name="javax.persistence.jdbc.driver" value="oracle.jdbc.driver.OracleDriver"/>
      <property name="eclipselink.target-database" value="Oracle11"/>
      <property name="eclipselink.id-validation" value="NULL"/>
      <property name="eclipselink.logging.level" value="OFF"/>
      <property name="eclipselink.cache.shared.default" value="false"/>
      <property name="eclipselink.query-results-cache" value="false"/>
      <property name="eclipselink.jdbc.sequence-connection-pool.initial" value="1"/>
      <property name="eclipselink.jdbc.sequence-connection-pool.max" value="1"/>
      <property name="eclipselink.session-event-listener" value="model.dao.DBSessionListener"/>
    </properties>
  </persistence-unit>

</persistence>

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

Nenhum comentário:

Postar um comentário

Observação: somente um membro deste blog pode postar um comentário.