Duvida Consulta Criteria Hibernate

Tenho uma Consulta, que vai pegar 2 Datas com nome de um Funcionário, e a minha duvida é a seguinte

*No meu Banco, Tenho uma Tabela “Agendamento” que possui uma Coluna chamada
“codigo_funcionario” que é minha chave_estrangeira, como ficaria a minha 2º Restrictons ?

`

    	public List<Agendamento> filtrarServico(Date dataInicio, Date dataFim, Funcionario funcionario) {

	Session session = HibernateConnection.getFactorySession();
	
	return session.createCriteria(Agendamento.class)
	 .add(Restrictions.between("data", dataInicio, dataFim))
	 .add(Restrictions.eq("funcionario.codigoFunc", funcionario.getCodigoFunc())).list();
}`

Exceção ao tentar consultar

Hibernate: select funcionari0_.codigoFunc as codigoFu1_1_0_, funcionari0_.func_nome as func_nom2_1_0_ from funcionario funcionari0_ where funcionari0_.codigoFunc=? java.lang.NullPointerException at repository.DAO.AgendametoDAO.filtrarServico(AgendametoDAO.java:94) at service.GestaoAgendamentos.filtrarAgendamento(GestaoAgendamentos.java:76) at view.ConsultaAgenda.filtrarAgendamento(ConsultaAgenda.java:75) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.apache.el.parser.AstValue.invoke(AstValue.java:247)

Minha tabela do Banco

Você fez um teste dando esse funcionario.getCodigoFunc() pra ver se está devolvendo o código corretamente? pelo stacktrace parece ser um problema no getCodigoFunc() retornando null.

Eu usei a mesma lógia de uma consulta que está funcionando.

`

@SuppressWarnings("unchecked")
@Override
@java.beans.Transient
public List<Servico> filtrarServico( Date dataInicio, Date dataFim,Funcionario funcionario) {
	
	
	Session session = HibernateConnection.getFactorySession();
	
	return session.createCriteria(Servico.class)
		   .add(Restrictions.between("data", dataInicio, dataFim))
		   .add(Restrictions.eq("funcionario.codigoFunc", funcionario.getCodigoFunc())).list();
}`

Consulta no Log
`
Hibernate:
select
funcionari0_.codigoFunc as codigoFu1_1_0_,
funcionari0_.func_nome as func_nom2_1_0_
from
funcionario funcionari0_
where
funcionari0_.codigoFunc=?
Hibernate:
select
this_.codigo as codigo1_2_1_,
this_.data as data2_2_1_,
this_.descricao as descrica3_2_1_,
this_.funcionario as funciona6_2_1_,
this_.nome as nome4_2_1_,
this_.valor as valor5_2_1_,
funcionari2_.codigoFunc as codigoFu1_1_0_,
funcionari2_.func_nome as func_nom2_1_0_
from
servico this_
left outer join
funcionario funcionari2_
on this_.funcionario=funcionari2_.codigoFunc
where
this_.data between ? and ?
and this_.funcionario=?

`

Deixa ver se entendi: Você quer lista todos agendamentos de um funcionário por um intervalo de data? e pelo nome do funcionário?

Se for isso que entendi eu tenho uma consulta que lista todas as dispensações com base no filtro escolhido, podendo:

Nenhum: Lista tudo
Por data: limita a data escolhida
Por nome: Por nome do paciente

para cada opção escolhida ele vai adicionando um criteria a pesquisa:

@SuppressWarnings("unchecked")
public List<DispensacaoPaciente> filtrados(DispensacaoPacienteFiltro filtro) {
Session session = this.manager.unwrap(Session.class);    
Criteria criteria = session.createCriteria(DispensacaoPaciente.class)
// fazemos uma associação (join) com paciente e nomeamos como "p"
.createAlias("paciente", "p");
if (filtro.getNumeroDe() != null) {
            // id deve ser maior ou igual (ge = greater or equals) a filtro.numeroDe  
criteria.add(Restrictions.ge("id", filtro.getNumeroDe()));
    }
       if (filtro.getNumeroAte() != null) {
 // id deve ser menor ou igual (le = lower or equal) a filtro.numeroDe
criteria.add(Restrictions.le("id", filtro.getNumeroAte()));
   }
 if (filtro.getDataSolicitacaoDe() != null) {
 criteria.add(Restrictions.ge("dataHoraSolicitado", filtro.getDataSolicitacaoDe()));
}

 if (filtro.getDataSolicitacaoAte() != null) {
criteria.add(Restrictions.le("dataHoraSolicitado", filtro.getDataSolicitacaoAte()));
}

if (StringUtils.isNotBlank(filtro.getPaciente())) {
 // acessamos o nome do cliente associado ao pedido pelo alias "p", criado anteriormente
    criteria.add(Restrictions.ilike("p.nome", filtro.getPaciente(), MatchMode.ANYWHERE));
 }
return criteria.addOrder(Order.asc("id")).list();
}

E a classe DispensacaoPacienteFiltro apenas tem os campos dos filtros que vou ter

private Long numeroDe;
private Long numeroAte;
private Date dataSolicitacaoDe;
private Date dataSolicitacaoAte;
private String paciente;

Com seus gets e sets

Espero que te ajude em algo!

Coloque um breakpoint na linha:

.add(Restrictions.eq(“funcionario.codigoFunc”, funcionario.getCodigoFunc())).list();

rode o jboss no modo debug e inspecione o objeto Funcionario para ver se realmente está preenchido o codigoFunc pois como o birche citou, o mais provável é o objeto funcionario ou funcionario.getcodigoFunc() estarem nulos.

Este é o primeiro passo a ser feito, mesmo que você tenha usado a mesma lógica de uma consulta que está funcionando, pois talvez quem está chamando esta consulta não está passando os dados corretamente.

Olá, sua sugestão ajudou muito. É porque estou entrando na área do desenvolvimento recentemente e algumas coisas tenho dificuldade.

Tirei apenas a sua linha citada, e consegui filtrar apenas as datas somente para testar. Quando coloco a ultima linha realmente está vindo nulo, Descupe a minha pergunta, como devo proceder?

OBS: No meu Bean, já adicionei o getters e setters com nestes respectivos atributos.

alguém??

Linha de qual? do Exemplo que postei ou do outro brother?