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.
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.
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()
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();
}
Comments