Monday, January 26, 2015

Búsquedas en JPA utilizando concat y like

Búsquedas en JPA utilizando concat y like

Deseamos tener una página xhtml donde realizamos búsquedas de registros, una tabla tiene los campos (primernombre, segundonombre,apellidopaterno,apellidomaterno).
Queremos buscar por primer nombre, apellido paterno o permitirle al usuario que escriba en una caja el nombre completo, es decir una combinacion de dos campos primernombre y apellidopaterno. Nuestro dialogo de busqueda (basado en Java Server Faces->Primefaces), tendrá una vista similar a esta.
busqueda.png

El código xhtml del diálogo donde se generan los componentes para el <p:outputLabel y el <p:inputText> correspondientes al atributo nombreCompleto que debe ser declarado en el @Named y el metodo buscarNombreCompleto()
s.png


Definiciones en el @Named
@Named
@ViewScoped
public class AdministradoresSistemaSearchController implements Serializable{
 private String nombreCompleto;

public String getNombreCompleto() {
       return nombreCompleto;
   }

   public void setNombreCompleto(String nombreCompleto) {
       this.nombreCompleto = nombreCompleto;
   }
public String buscarNombreCompleto() {
       try {
           administradoresSistema.setPrimerNombre("");
           administradoresSistema.setPrimerNombre("");
           administradoresSistemaList = administradoresSistemaFacade.findByNombreCompletoLike(nombreCompleto);
       } catch (Exception e) {
           JSFUtil.addErrorMessage(e.getLocalizedMessage());
       }
       return "";
   }

En el Facade
Descomponer el texto para separar el nombre y el apellido y colocarle % entre ambos para hacer más genérica la búsqueda.
Esto permitirá buscar por ejemplo
a vill → buscara todos los nombres que inicien con a y el apellido que inicie con vill
aristides v → buscara todos los nombre que inicien con aristides y el apellido inicie con v

   public List<AdministradoresSistema> findByNombreCompletoLike(String nombreCompleto) {
      nombreCompleto = nombreCompleto.trim();
      StringTokenizer st = new StringTokenizer(nombreCompleto);
      String texto="";
      while (st.hasMoreTokens()) {
          if(!texto.equals("")){
              texto+="%";
          }
          texto += " "+st.nextToken();

    }
      nombreCompleto = "%" +texto.trim() + "%";
       Query query = em.createQuery("SELECT a FROM AdministradoresSistema a WHERE CONCAT (lower(a.primerNombre),' ',lower(a.apellidoPaterno)) like ?1");
       query.setParameter(1, nombreCompleto);
      return query.getResultList();

  }

No comments: