[RESOLVIDO] Problema com NamedQuery JPA campo Date

12 respostas
D

Olá Pessoal!!

Boa noite,
Por favor, gostaria que me ajudassem, o meu caso é o seguinte:

Eu tendo a classe @Entity Agenda com o seguinte:
@Column(nullable=false)
    @Temporal(javax.persistence.TemporalType.DATE)
    private Date dataMarcada;
E nesta mesma classe a namedQuery:
@NamedQueries({
    @NamedQuery(name="buscarAgendaMedico", query="select agenda from Agenda agenda where agenda.medico.id = :codigomedico and agenda.datamarcada = datamarcada order by agenda.hora")
})
No meu DaoAgenda tenho:
public Iterator consultarAgendaMedico(Agenda a){
        EntityManager dao = Conexao.getEM();
        Query query = dao.createNamedQuery("buscarAgendaMedico");
        query.setParameter("codigomedico", a.getMedico().getCodigoPessoa());
        
        query.setParameter("datamarcada", a.getDataMarcada());
        query.setParameter("hora", a.getHora());
        
        List<Agenda> resultados = query.getResultList();
        Iterator<Agenda> iteradorAgenda = resultados.iterator();
        dao.close();
        return iteradorAgenda;
    }
Enfim, Dá o seguinte erro:
Exception in thread "AWT-EventQueue-0" java.lang.ExceptionInInitializerError   
        at dao.DaoTipoUsuario.consultarTodos(DaoTipoUsuario.java:24)   
        at viewControl.Principal.adicionaTiposDeUsuarioBd(Principal.java:561)   
        at viewControl.Principal.<init>(Principal.java:58)   
        at viewControl.Principal$1.run(Principal.java:579)   
        at java.awt.event.InvocationEvent.dispatch(InvocationEvent.java:209)   
        at java.awt.EventQueue.dispatchEvent(EventQueue.java:597)   
        at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)   
        at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)   
        at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)   
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)   
        at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)   
        at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)   
Caused by: javax.persistence.PersistenceException: [PersistenceUnit: SysPoliClinicPU] Unable to build EntityManagerFactory   
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:677)   
        at org.hibernate.ejb.HibernatePersistence.createEntityManagerFactory(HibernatePersistence.java:126)   
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:51)   
        at javax.persistence.Persistence.createEntityManagerFactory(Persistence.java:33)   
        at dao.Conexao.<clinit>(Conexao.java:14)   
        ... 12 more   
Caused by: org.hibernate.HibernateException: Errors in named queries: buscarAgendaMedico   
        at org.hibernate.impl.SessionFactoryImpl.<init>(SessionFactoryImpl.java:365)   
        at org.hibernate.cfg.Configuration.buildSessionFactory(Configuration.java:1294)   
        at org.hibernate.cfg.AnnotationConfiguration.buildSessionFactory(AnnotationConfiguration.java:859)   
        at org.hibernate.ejb.Ejb3Configuration.buildEntityManagerFactory(Ejb3Configuration.java:669)   
        ... 16 more

O erro só some se eu tirar isso: and agenda.datamarcada = :datamarcada.
Tentei usar a clausula to_date na namedQuery e nada...
To quase transformando o campo em String.....

Alguém teria alguma idéia de como posso resolver isso???
Muito obrigada pessoal!
Dina

12 Respostas

D

Acho que está faltando os ‘:’ para datamarcada.

@NamedQueries({  
        @NamedQuery(name="buscarAgendaMedico", query="select agenda from Agenda agenda 
         where agenda.medico.id =:codigomedico and agenda.datamarcada = :datamarcada order by agenda.hora")  
    })
D

dsjvb,
Muito obrigada por responder, realmente estava faltando o : mas mesmo assim o erro continua, os códigos que testei foram:

@NamedQueries({ @NamedQuery(name="buscarAgendaMedico", query="select agenda from Agenda agenda where agenda.medico.id =:codigomedico and agenda.datamarcada = :datamarcada order by agenda.hora") })

@NamedQueries({ @NamedQuery(name="buscarAgendaMedico", query="select agenda from Agenda agenda where agenda.medico.id =:codigomedico and to_date(agenda.datamarcada) = to_date(:datamarcada, 'dd/MM/yyyy') order by agenda.hora") }) Sendo que testei tbm: to_date(:datamarcada, ‘yyyy/MM/dd’) e tbm to_date(:datamarcada, ‘yyyy-MM-dd’) e nada…

Alguém saberia como resolver isso??
Muito obrigada!!

D
Pessoal, tem um detalhe que eu não citei. Como eu havia informado:
dina:
No meu DaoAgenda tenho:
public Iterator consultarAgendaMedico(Agenda a){
        EntityManager dao = Conexao.getEM();
        Query query = dao.createNamedQuery("buscarAgendaMedico");
        query.setParameter("codigomedico", a.getMedico().getCodigoPessoa());
        
        query.setParameter("datamarcada", a.getDataMarcada());
        query.setParameter("hora", a.getHora());
        
        List<Agenda> resultados = query.getResultList();
        Iterator<Agenda> iteradorAgenda = resultados.iterator();
        dao.close();
        return iteradorAgenda;
    }
Dando um:
System.out.println(agenda.getDataMarcada())
Aparece na saída: Tue Nov 02 00:00:00 BRST 2010 E no meu BD na coluna datamarcada há o seguinte dado 2010-11-02

Acho que deve ser isso, nééé??
Alguém sabe como resolvo?? Pois tentei usar o to_date e nada....

Obrigada..

D

Qual provider está configurado no persistence.xml?

Acho que pode ser alguma coisa de configuração.

D

Olá!!
Desculpa a demora em responder:

<provider>org.hibernate.ejb.HibernatePersistence</provider>

O que acha??
Muito obrigada:-)

D

É o mesmo provider que eu estou usando … acho que não é isso não.
No banco de dados a coluna é do tipo DATETIME ou só DATE?

D

Apenas date, por este motivo acho que está dando o erro…

Pois no meu BD o dado está como: 2010-11-02
E no a.getDataMarcada() está como: Tue Nov 02 00:00:00 BRST 2010

D

Acho que pode ser isso, tenta mudar pra DATETIME e depois fala se funcionou.

D

Não…
:frowning:

D

Posta o código do método consultarTodos.

Eric_Yuzo

dina:
@Column(nullable=false) @Temporal(javax.persistence.TemporalType.DATE) private Date dataMarcada;

E nesta mesma classe a namedQuery:
@NamedQueries({ @NamedQuery(name="buscarAgendaMedico", query="select agenda from Agenda agenda where agenda.medico.id = :codigomedico and agenda.datamarcada = datamarcada order by agenda.hora") })


Acho que o problema na query é que o nome do campo está diferente do passado para query. Seu campo é dataMarcada com “M” maiúsculo e o parâmetro da query está datamarcada com “m” minúsculo. Tente trocar em sua NamedQuery:

:codigomedico and agenda.datamarcada = datamarcada por :codigomedico and agenda.dataMarcada = :datamarcada

D

Eric Yuzo
EU NÃO ACREDITO NISSO!!!
DIAS E DIAS NISSO!!

Na verdade, eu não testei o select, mas pelo menos não apareceu mais o erro e o programa rodou!!!
:smiley:

dsjbv Obrigada por tudo!!!

Criado 1 de novembro de 2010
Ultima resposta 2 de nov. de 2010
Respostas 12
Participantes 3