[RESOLVIDO] Problema em criteria com busca em relacionamento

7 respostas
Kleber-rr

Olá pessoal, estou tentando fazer essa criteria, para me retornar uma lista de Funcionarios por OrgaoGestor, da seguinte forma:

Criteria
@SuppressWarnings("unchecked")
	public List<Funcionario> pesquisaFuncionarios(String nome, String cpf,
			String rg, Long id) {
		Criteria c = session.createCriteria(Funcionario.class);
		c.add(Restrictions.ilike("nome", "%" + nome + "%"));
		c.add(Restrictions.ilike("cpf", "%" + cpf + "%"));
		c.add(Restrictions.ilike("rg", "%" + rg + "%"));
		c.createCriteria("orgaogestor").add(
				Restrictions.eq("cod_orgaogestor", id));
		c.addOrder(Order.asc("nome"));

		return c.list();
	}
Bean
public List<Funcionario> getFuncionariosByNome() {
		Session session = HibernateUtil.currentSession();
		FuncionarioDao funcionarioDao = new FuncionarioDao(session,
				Funcionario.class);
		List<Funcionario> lista = funcionarioDao.pesquisaFuncionarios(
				this.funcionario.getNome(), this.funcionario.getCpf(),
				this.funcionario.getRg(), this.funcionario.getOrgaogestor()
						.getCod_orgaogestor());
		return lista;
	}
erro:
javax.el.ELException: /pages/funcionario/lista.xhtml @15,171 rendered="#{not empty funcionarioHandler.funcionariosByNome}": Error reading 'funcionariosByNome' on type br.gov.rr.setrabes.handler.FuncionarioHandler

Caused by: java.lang.NullPointerException
	at br.gov.rr.setrabes.handler.FuncionarioHandler.getFuncionariosByNome(FuncionarioHandler.java:343)
	at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
	at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
	at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
	at java.lang.reflect.Method.invoke(Method.java:616)
	at javax.el.BeanELResolver.getValue(BeanELResolver.java:62)
	at javax.el.CompositeELResolver.getValue(CompositeELResolver.java:53)
	at com.sun.faces.el.FacesCompositeELResolver.getValue(FacesCompositeELResolver.java:64)
	at org.apache.el.parser.AstValue.getValue(AstValue.java:118)
	at org.apache.el.parser.AstEmpty.getValue(AstEmpty.java:45)
	at org.apache.el.parser.AstNot.getValue(AstNot.java:42)
	at org.apache.el.ValueExpressionImpl.getValue(ValueExpressionImpl.java:186)
	at com.sun.facelets.el.TagValueExpression.getValue(TagValueExpression.java:71)
	... 39 more

Alguem pode ajudar?? Agradeço.

7 Respostas

pdioniziofilho

Simples cara,

ta dando NullPointerException na classe FuncionarioHandler na linha 343.

Da uma olhada nessa classe e nessa linha que provavelmente você está dando um get em uma propriedade nula.

Kleber-rr

pdioniziofilho:
Simples cara,

ta dando NullPointerException na classe FuncionarioHandler na linha 343.

Da uma olhada nessa classe e nessa linha que provavelmente você está dando um get em uma propriedade nula.

Blz man, a questão que ele está dando o nullpointerexception na linha do:

public List<Funcionario> getFuncionariosByNome() { Session session = HibernateUtil.currentSession(); FuncionarioDao funcionarioDao = new FuncionarioDao(session, Funcionario.class); List<Funcionario> lista = funcionarioDao.pesquisaFuncionarios( this.funcionario.getNome(), this.funcionario.getCpf(), this.funcionario.getRg(), this.funcionario.getOrgaogestor() .getCod_orgaogestor()); //ESSA É A LINHA QUE ESTÁ DANDO A EXCEPTION return lista; }

Eu estou fazendo relacionamento bidirecional, mas não estou usando o ManyToMany (o que faria as tabelas relacionais), e sim o ManyToOne/OneToMany.
Tentei tb utilizar a instancia ao objeto relacional (OrgaoGestor og) na criteria, e ele não me retorna esse erro, em compensação, não me retorna resultado algum…

Agradeço a ajuda.

pdioniziofilho

Desculpe minha santa ignorancia se nao entendi (entendo) sua duvida,

Mas nessa linha

this.funcionario.getOrgaogestor().getCod_orgaogestor()

se o orgaoGestor do funcionario não estiver carregado, vai dar NullPointer mesmo na hora de usar o getter.

Ai ou você usa um operador ternário e verifica se o cara não é nulo antes e depois verifica na criteria se o cara é null ou nao para não considerar o valor ou então você da um jeito de carregar esse objeto antes de utiliza-lo como argumento para a chamada do seu metodo de pesquisa.

Kleber-rr
pdioniziofilho:
Desculpe minha santa ignorancia se nao entendi (entendo) sua duvida,

Mas nessa linha

# this.funcionario.getOrgaogestor().getCod_orgaogestor()

se o orgaoGestor do funcionario não estiver carregado, vai dar NullPointer mesmo na hora de usar o getter.

Ai ou você usa um operador ternário e verifica se o cara não é nulo antes e depois verifica na criteria se o cara é null ou nao para não considerar o valor ou então você da um jeito de carregar esse objeto antes de utiliza-lo como argumento para a chamada do seu metodo de pesquisa.

Que nada amigo, santa ignorância é a minha por ser novato na área!! :D O campo orgao gestor dentro da tabela funcionario não está vazio. E os relacionamentos das classes estão conforme o exibido abaixo:
@Entity
public class Funcionario {

	@Id
	@GeneratedValue
	private Long cod_funcionario;
        ...

	@ManyToOne
	@JoinColumn(name = "orgaogestor")
	private OrgaoGestor orgaogestor;
@Entity
@Table(name = "orgaogestor")
public class OrgaoGestor {

	@Id
	@GeneratedValue
	@Column(name = "cod_orgaogestor")
	private Long cod_orgaogestor;
        ...

	@OneToMany(mappedBy = "orgaogestor", fetch = FetchType.LAZY)
	private List<Funcionario> funcionario = new ArrayList<Funcionario>();

Então, como eu deveria fazer a chamada desse objeto no bean para q naum me retorne o nullpointerexception??

Agradeço!!

Kleber-rr

Pessoal, consegui resolver em parte meu problema. Só que agora, a busca dentro dos critérios ficam condicionadas à seleção do órgãogestor. Teria como eu fazer sem condicioná-la ao orgaogestor, ou seja, um campo independente do preenchimento do outro??

Ficou assim:

public List&lt;Funcionario&gt; getFuncionariosByNome() { Session session = HibernateUtil.currentSession(); FuncionarioDao funcionarioDao = new FuncionarioDao(session, Funcionario.class); List&lt;Funcionario&gt; lista = funcionarioDao .pesquisaFuncionarios(this.funcionario.getNome(), this.funcionario.getCpf(), this.funcionario.getRg(), this.orgaogestor.getCod_orgaogestor()); return lista; }

e no dao:

@SuppressWarnings("unchecked") public List&lt;Funcionario&gt; pesquisaFuncionarios(String nome, String cpf, String rg, Long codOrgao) { Criteria c = session.createCriteria(Funcionario.class); List&lt;Funcionario&gt; results = new ArrayList&lt;Funcionario&gt;(); c.add(Restrictions.like("nome", nome, MatchMode.ANYWHERE)); c.add(Restrictions.like("cpf", cpf, MatchMode.ANYWHERE)); c.add(Restrictions.like("rg", rg, MatchMode.ANYWHERE)); c.add(Restrictions.eq("orgaogestor.cod_orgaogestor", codOrgao)); results = (List&lt;Funcionario&gt;) c.list(); return results; }

Agradeço a ajuda.

Kleber-rr

eae, alguem?

Kleber-rr

Resolvido!

Eu tive de criar métodos separados tanto no dao quanto no bean, e um método de busca que me chamasse cada método, de acordo com os campos preenchidos.
public List&lt;Funcionario&gt; getFuncionariosByCampos() {
		List&lt;Funcionario&gt; list = new ArrayList&lt;Funcionario&gt;();

		String nome = this.funcionario.getNome();
		String cpf = this.funcionario.getCpf();
		String rg = this.funcionario.getRg();
		Long og = this.orgaogestor.getCod_orgaogestor();

		if (og != null && (nome).isEmpty()) {
			System.out.println("leu primeira condição");
			return getFuncionariosOrgaoGestor();
		} else if ((nome) != null && !(nome).isEmpty()) {
			System.out.println("leu segunda condição");
			return getFuncionariosNome();
		} else if ((rg) != null && !(rg).isEmpty()) {
			System.out.println("leu terceira condição");
			return getFuncionariosRG();
		} else if ((cpf) != null && !(cpf).isEmpty()) {
			System.out.println("leu quarta condição");
			return getFuncionariosCPF();
		}

		return list;
	}

Agradeço a ajuda de todos.

Criado 24 de fevereiro de 2010
Ultima resposta 1 de mar. de 2010
Respostas 7
Participantes 2