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 ?
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)
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;
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.