smnj
Junho 19, 2012, 2:42pm
#1
Olá pessoal, estou tendo problema com uma query que teoricamente seria simples:
Bem, consigo obter a consulta a partir de parte do nome, mas não o nome exato do registro, ou seja, consigo obter todas as palavras que contenham DRO, passando ‘DRO’ como parâmetro, mas não consigo, por exemplo, passar: ‘VIDRAÇARIA IMPERIAL - VIDROS - BOX - FORRO - DIVISÓRIAS’ e obtê-lo, abaixo a minha query e parte da página que tenho para obtê-lo:
Query:
@SuppressWarnings("unchecked")
public List<Empresa> buscarPorNome(String nome) {
Criteria query = this.session.createCriteria(Empresa.class).add(
Restrictions.like("nome", "%" + nome + "%"));
return query.list();
}
página (a ideia é que ao escolher/digitar o valor, pudesse obtê-lo, bem, consigo obtê-lo, porém a query, não o traz):
<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"
size="82">
</p:autoComplete>
</div>
<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>
Obrigado desde já os que ajudaram.
Alys
Junho 20, 2012, 8:46am
#2
Estranho, o Criteria é desse jeito mesmo.
Pergunta boba: você já confirmou se o parâmetro nome está indo certo? Tipo, em maiúsculo mesmo, sem espaço em branco, ou algum outro problema?
smnj
Junho 20, 2012, 12:44pm
#3
Olá, Alys, tudo bem, o parâmetro nome vem corretamente sim, se eu digitar, mas não se clicar sobre ele no autoComplete.
Acho que assim fica melhor:
Restrictions.ilike("nome", nome,MatchMode.ANYWHERE));
smnj
Junho 20, 2012, 12:48pm
#5
Perdão, algo mudou, ao clicar em um valor do autoComplete, não estou conseguindo o retornar.
A página:
<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"
size="82">
</p:autoComplete>
</div>
<div id="botaopesq">
<h: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}" />
</h:commandLink>
Vou passar o meu converter:
package com.portal.view;
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;
}
}
smnj
Junho 20, 2012, 12:54pm
#6
Não mudou nada, raf4ever.
smnj
Junho 20, 2012, 1:16pm
#7
Bem, não tenho muita experiencia com o primefaces, mas tenho ideia de que o problema possa ser ao obter o valor a partir de um clique, talvez na visão.
tente assim no seu dao
[code]
public List getFiltro(String palavra){
Session session = HibernateUtil.getSf().openSession();
session.beginTransaction();
Query q = session.createQuery(from ContaPagar as conta where conta.nome like :nome);
q.setString("nome", "%" + palavra + "%");
List<T> beans = q.list();
session.getTransaction().commit();
return beans;[/code]
smnj
Junho 21, 2012, 8:15am
#11
fiz desse modo, porém continuou o problema
@SuppressWarnings("unchecked")
public List<Empresa> buscarPorNome(String nome) {
Query query = this.session.createQuery("from Empresa as empresa where empresa.nome like:nome");
query.setString("nome", "%" + nome + "%");
return query.list();