Problema com obter valor em um método Like JPA

32 respostas
S

Pessoal, estou tentando obter uma lista a partir de um método com uma consulta like, mas estou tendo dificuldade de passar o parametro NOME que por sinal está vindo nulo, como proceder?

O método em uma interface DAO:

public List<Empresa> buscarPorNome(String nome);

Declaração em uma classe chamada DAOHibernate:

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

Em uma classe que trata regra de negócio:

public List<Empresa> buscaPorNome(String nome) {
		return this.empresaDAO.buscarPorNome(nome);
	}

ManagedBean:

public List<Empresa> buscarPorNome() {
		if (this.listagem == null) {
			EmpresaRN empresaRN = new EmpresaRN();
			this.lista = empresaRN.buscaPorNome(empresa.getNome());
		}
		return this.lista;
	}

O hibernate mostra o hql assim:

Hibernate: 
    /* select
        e 
    from
        Empresa e 
    where
        e.nome LIKE'null%' */ select
            empresa0_.cod_empresa as cod1_1_,
            empresa0_.descricao as descricao1_,
            empresa0_.email as email1_,
            empresa0_.endereco as endereco1_,
            empresa0_.logo as logo1_,
            empresa0_.nome as nome1_,
            empresa0_.prioridade as prioridade1_,
            empresa0_.site as site1_,
            empresa0_.telefone as telefone1_ 
        from
            empresa empresa0_ 
        where
            empresa0_.nome like 'null%'

Página:

<p:inputText value="#{empresaBean.empresa.nome}"
						style="width: 600px;height: 24px; font-size:15px;">
					</p:inputText>
				</div>
				<div id="botaopesq">
					<p:commandLink actionListener="#{empresaBean.buscarPorNome}"
						immediate="true" title="Pesquisar"
						value="#{empresaBean.empresa.nome}">
						<h:graphicImage library="images" name="botao.png" width="118"
							height="27" style="border:0" />
						<f:setPropertyActionListener target="#{empresaBean.empresa}"
							value="#{empresa}" />
						<f:setPropertyActionListener target="#{empresaBean.destinoSalvar}"
							value="/publico/pesquisa"></f:setPropertyActionListener>
					</p:commandLink>

32 Respostas

R

Aparentemente tudo correto,coloca aqui os arquivos de configuração.

drsmachado

De onde vem nome?

S

Perdão pela demora da resposta, o nome deveria vir da página para obter o valor no hql e como resultado deve trazer uma lista com os valores relacionados.

S

Você diz os xml’s, raf4ever ?

S

Porque executo o hql sem problema, ele aprece comentado no console, porém vem nulo.

drsmachado

smnj:
Porque executo o hql sem problema, ele aprece comentado no console, porém vem nulo.

Por que a variável nome vem nula para a construção da query. Provavelmente não haja qualquer registro com nome null + alguma coisa.

S

Bom, o problema é que o parâmetro “nome” está vindo nulo para a construção da query, ou seja, não estou conseguindo passá-lo.
e não exatamente que a query não retorne nada, creio eu.
porque, pelos testes que fiz, teria no banco o valor solicitado à query, mas ela não recebe o parâmetro.

drsmachado

smnj:
Bom, o problema é que o parâmetro “nome” está vindo nulo para a construção da query, ou seja, não estou conseguindo passá-lo.
e não exatamente que a query não retorne nada, creio eu.
porque, pelos testes que fiz, teria no banco o valor solicitado à query, mas ela não recebe o parâmetro.

Insisto na pergunta: De onde vem o nome?

S

O Nome seria o nome da empresa, da Entity, Empresa.

drsmachado

Não sei se eu estou perguntando de forma errada ou se seu entendimento é que está distorcido, enfim.
Creio que o problema seja este

<f:setPropertyActionListener target="#{empresaBean.empresa}"  
            value="#{empresa}" />

Já que você tem um apreço pelo Jack e só traz retalhos de código para analisarmos.

S

Devo substituir isso?
o que deve haver no lugar?

drsmachado

smnj:
Devo substituir isso?
o que deve haver no lugar?

Como eu vou saber?
Só tenho pedaços de código, sem nenhum nexo aparente, a não ser o que você postou.
Aliás, você chegou a debugar para ver se o MB recebe o parâmetro?
Pelo visto, não ainda.

S

Justamente, não recebe nada, é nulo.

S

O que posso fazer para tornar mais claro, você precisa de mais partes do código?

S

Diga qual exatamente, posso passar a classe se quiser.

S

Mas sim, eu debuquei, está nulo o valor.

S
Este é o managedBean:
package com.portal.web;

import java.util.List;

import javax.faces.application.FacesMessage;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.RequestScoped;
import javax.faces.context.FacesContext;

import com.portal.empresa.Empresa;
import com.portal.empresa.EmpresaRN;

@ManagedBean
@RequestScoped
public class EmpresaBean {
	private Empresa empresa = new Empresa();
	private EmpresaRN empresaRN = new EmpresaRN();
	private List&lt;Empresa&gt; lista;
	private List&lt;Empresa&gt; listagem;
	private List&lt;Empresa&gt; empresas;
	private String destinoSalvar;

	public String novo() {
		this.destinoSalvar = "empresaSucesso";
		this.empresa = new Empresa();
		return "empresa";
	}

	public String salvar() {
		FacesContext context = FacesContext.getCurrentInstance();
		if (isEmpresaCadastrada(empresa)) {
			FacesMessage facesMessage = new FacesMessage(
					"Digite um nome diferente de empresa, esta j&#65533; est&#65533; cadastrada.");
			context.addMessage(null, facesMessage);
			return null;
		}
		EmpresaRN empresaRN = new EmpresaRN();
		empresaRN.salvar(this.empresa);
		return "empresaSucesso";
	}

	public String editar() {
		return "/admin/empresa";

	}

	public String excluir() {
		EmpresaRN empresaRN = new EmpresaRN();
		empresaRN.excluir(this.empresa);
		this.lista = null;
		return null;
	}

	public List&lt;Empresa&gt; getLista() {
		if (this.lista == null) {
			EmpresaRN empresaRN = new EmpresaRN();
			this.lista = empresaRN.listar();
		}
		return this.lista;
	}

	public List&lt;Empresa&gt; buscarPorNome() {
		if (this.listagem == null) {
			EmpresaRN empresaRN = new EmpresaRN();
			this.lista = empresaRN.buscaPorNome(empresa.getNome());
		}
		return this.lista;
	}

	public boolean isEmpresaCadastrada(Empresa empresa) {
		return empresaRN.verificaEmpresa(empresa.getNome());
	}

	public Empresa getEmpresa() {
		return empresa;
	}

	public void setEmpresa(Empresa empresa) {
		this.empresa = empresa;
	}

	public EmpresaRN getEmpresaRN() {
		return empresaRN;
	}

	public void setEmpresaRN(EmpresaRN empresaRN) {
		this.empresaRN = empresaRN;
	}

	public List&lt;Empresa&gt; getListagem() {
		return listagem;
	}

	public void setListagem(List&lt;Empresa&gt; listagem) {
		this.listagem = listagem;
	}

	public List&lt;Empresa&gt; getEmpresas() {
		return empresas;
	}

	public void setEmpresas(List&lt;Empresa&gt; empresas) {
		this.empresas = empresas;
	}

	public String getDestinoSalvar() {
		return destinoSalvar;
	}

	public void setDestinoSalvar(String destinoSalvar) {
		this.destinoSalvar = destinoSalvar;
	}

	public void setLista(List&lt;Empresa&gt; lista) {
		this.lista = lista;
	}

}
R

Sim.

drsmachado

Sim.
Queria entender por que precisa dos xmls da configuração do JPA se o problema é uma variável nula que detona a consulta…

R

Sim.
Queria entender por que precisa dos xmls da configuração do JPA se o problema é uma variável nula que detona a consulta…

Quem disse que é o xml de configuração só do JPA?

Me refiro á todos os arquivo de configuração,ele pode ter algum detalhe que está ‘bichando’ todo o resto.

R

E outra: pra que o immediate=true numa tela de consulta?

drsmachado

Sim.
Queria entender por que precisa dos xmls da configuração do JPA se o problema é uma variável nula que detona a consulta…

Quem disse que é o xml de configuração só do JPA?

Me refiro á todos os arquivo de configuração,ele pode ter algum detalhe que está ‘bichando’ todo o resto.
Faz todo sentido, ainda mais que ele usa managedBeans com annotations…

R

EDIT:Na mosca,fiz um teste aqui numa tela de consulta minha.Coloquei o immediate=true e os campos passaram a vir null.

drsmachado

EDIT:Na mosca,fiz um teste aqui numa tela de consulta minha.Coloquei o immediate=true e os campos passaram a vir null.
Mas ainda quer ver as configurações nos xml?

R

EDIT:Na mosca,fiz um teste aqui numa tela de consulta minha.Coloquei o immediate=true e os campos passaram a vir null.
Mas ainda quer ver as configurações nos xml?

Se vc LER com atenção vai ver que eu coloquei essa resposta DEPOIS da resposta em que eu pedia pra ver os arquivos.

S

Perdão pela demora da resposta, estava indo trabalhar.

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;!DOCTYPE hibernate-configuration PUBLIC
		"-//Hibernate/Hibernate Configuration DTD 3.0//EN"
		"http://hibernate.sourceforge.net/hibernate-configuration-3.0.dtd"&gt;
&lt;hibernate-configuration&gt;
	&lt;session-factory&gt;
		&lt;property name="connection.datasource"&gt;java:/comp/env/jdbc/LzaonlineDB&lt;/property&gt;

		&lt;property name="dialect"&gt;org.hibernate.dialect.MySQL5InnoDBDialect&lt;/property&gt;
		&lt;property name="current_session_context_class"&gt;thread&lt;/property&gt;

		&lt;!-- Usando as configurações do C3P0 para pool de conexões --&gt;

		&lt;property name="c3po.min_size"&gt;5&lt;/property&gt;
		&lt;property name="c3po.max_size"&gt;20&lt;/property&gt;
		&lt;property name="c3po.timeout"&gt;300&lt;/property&gt;
		&lt;property name="c3po.max_statements"&gt;50&lt;/property&gt;
		&lt;property name="c3po.idle_test_period"&gt;3000&lt;/property&gt;

		&lt;!-- Configurações de Debug --&gt;

		&lt;property name="show_sql"&gt;true&lt;/property&gt;
		&lt;property name="format_sql"&gt;true&lt;/property&gt;
		&lt;property name="generate_statistics"&gt;true&lt;/property&gt;
		&lt;property name="use_sql_comments"&gt;true&lt;/property&gt;
		&lt;property name="hibernate.hbm2ddl.auto"&gt;update&lt;/property&gt;

		&lt;mapping class="com.portal.usuario.Usuario" /&gt;
		&lt;mapping class="com.portal.empresa.Empresa" /&gt;
		&lt;mapping class="com.portal.contato.Contato" /&gt;
	&lt;/session-factory&gt;
&lt;/hibernate-configuration&gt;
S

Vou tirar o immediate tmbm pra ver.

S

Só um instante, vou passar o web.xml e o context do spring.

S

Spring context

&lt;?xml version="1.0" encoding="UTF-8"?&gt;
&lt;Context reloadable="true"&gt;
&lt;Resource name="jdbc/LzaonlineDB"
auth="Container"
type="javax.sql.DataSource"
maxActive="100"
maxIdle="30"
MaxWait="10000"
username="root"
password=""
driverClassName="com.mysql.jdbc.Driver"
url="jdbc:mysql://localhost:3306/lzaonline?autoReconnect=true"/&gt;
&lt;/Context&gt;
S

Valeu, só tirar o immediate, funcionou.
Muito obrigado mesmo.

S

Bem, agora, recebe e consulta o valor, porém tenho uma dúvida: como faço para obter esses dados em uma outra página?

S

Bem, agora, recebe e consulta o valor, porém tenho uma dúvida: como faço para obter esses dados em uma outra página?

Criado 11 de junho de 2012
Ultima resposta 12 de jun. de 2012
Respostas 32
Participantes 3