Bem, criei um autocomplete, funcionou perfeitamente, não tenho nenhum problema com ele, exceto o que passo para o método posterior, para a consulta, que é executada através do que obtenho no autocomplete:
Para ser claro, quando busco uma parte do nome, como por exemplo “DROGARIA” tenho uma listagem com todas as drogarias, mas quando tento uma busca com um valor acima de 50 caracteres, não traz nada, por alguma razão, alguém pode me explicar isso e como resolver?
Sendo assim, o código abaixo:
Este e o autocomplete:
<div id="campos">
<p:autoComplete value="#{empresaBean.empresa.nome}" var="empresa"
completeMethod="#{empresaBean.autocompleteEmpresa}"
itemLabel="#{empresa.nome}" itemValue="#{empresa.nome}"
converter="Converter"
onkeyup="this.value = this.value.toUpperCase();" maxResults="5" >
</p:autoComplete>
</div>
Este abaixo é uma parte da página que utilizo para passar uma pesquisa por nome, através do autocomplete:
<div id="botaopesq">
<p:commandLink actionListener="#{empresaBean.buscarPorNome}"
title="Pesquisar" value="#{empresa.nome}"
action="pesquisa">
<h:graphicImage library="images" name="botao.png" width="118"
height="27" style="border:0" />
<f:setPropertyActionListener target="#{empresaBean.empresa}"
value="#{empresa}" />
</p:commandLink>
Este é o método que uso para obter uma lista a partir de um nome, com um like, através do conteúdo do <p:autcomplete>
@SuppressWarnings("unchecked")
public List<Empresa> buscarPorNome(String nome) {
Query query = this.session.createQuery("SELECT e FROM Empresa e WHERE e.nome LIKE'%" + nome + "%'");
return query.list();
}
Este é o converter que uso para o <p:autocomplete>
package com.portal.view;
import java.lang.reflect.Field;
import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;
import javax.persistence.Id;
@FacesConverter(value = "Converter")
public class EntityConverter implements Converter {
public Object getAsObject(FacesContext ctx, UIComponent component, String value) {
System.out.println("ECV-GO");
return value;
}
public String getAsString(FacesContext ctx, UIComponent component, Object obj) {
System.out.println("ECV-GS");
if (obj != null && !"".equals(obj)) {
String id;
try {
id = this.getId(getClazz(ctx, component), obj);
if (id == null) {
id = "";
}
id = id.trim();
component.getAttributes().put(id, getClazz(ctx, component).cast(obj));
return id;
} catch (SecurityException e) {
e.printStackTrace(); // seu log aqui
} catch (IllegalArgumentException e) {
e.printStackTrace(); // seu log aqui
} catch (NoSuchFieldException e) {
e.printStackTrace(); // seu log aqui
} catch (IllegalAccessException e) {
e.printStackTrace(); // seu log aqui
}
}
return null;
}
private Class<?> getClazz(FacesContext facesContext, UIComponent component) {
return component.getValueExpression("value").getType(facesContext.getELContext());
}
public String getId(Class<?> clazz, Object obj) throws SecurityException, NoSuchFieldException, IllegalArgumentException, IllegalAccessException {
for (Field field : clazz.getDeclaredFields()) {
if ((field.getAnnotation(Id.class)) != null) {
Field privateField = clazz.getDeclaredField(field.getName());
privateField.setAccessible(true);
if (privateField.get(clazz.cast(obj)) != null) {
return (String) field.getType().cast(privateField.get(clazz.cast(obj))).toString();
} else {
return null;
}
}
}
return null;
}
}