1
resposta

[Sugestão] Query jpql não funciona

Fiz um código com 3 entidades: Medico, Consulta e Paciente, e estou tentando desenvolver um método que marque as consultas em horarios e datas diferentes, e caso haja conflitos ele retorne uma mensagem, mas não estou conseguindo: Eis o método:

 private boolean consultaExiste(Consulta consulta) {
        EntityManager entityManager = emf.createEntityManager();
        TypedQuery<Long> query = entityManager.createQuery(
            "SELECT COUNT(c) FROM Consulta c WHERE c.medico = :medico AND c.paciente = :paciente AND c.dataHora = :dataHora", 
            Long.class);
        query.setParameter("medico", consulta.getMedico());
        query.setParameter("paciente", consulta.getPaciente());
        query.setParameter("dataHora", consulta.getDataHora());
        
        Long count = query.getSingleResult();
        return count > 0; // Retorna true se existir uma consulta igual
    }

Entidade Consulta:

package br.com.srcm.model;

import java.time.LocalDateTime;

import javax.persistence.AttributeOverride;
import javax.persistence.AttributeOverrides;
import javax.persistence.Column;
import javax.persistence.Embedded;
import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.persistence.Table;

@Entity
@Table(name = "consultas")
public class Consulta {
    
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    

    private LocalDateTime dataHora;
    
    private String descricao;
        
    @ManyToOne
    @JoinColumn(name = "medico_id")
    private Medico medico;
    
    @ManyToOne
    @JoinColumn(name = "paciente_id")
    private Paciente paciente;
    
    public Consulta() {}
    
    
    public Consulta(LocalDateTime dataHora, String descricao, Medico medico, Paciente paciente) {
        super();
        this.setDataHora(dataHora);
        this.descricao = descricao;
        this.medico = medico;
        this.paciente = paciente;
    }


    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Medico getMedico() {
        return medico;
    }

    public void setMedico(Medico medico) {
        this.medico = medico;
    }

    public Paciente getPaciente() {
        return paciente;
    }

    public void setPaciente(Paciente paciente) {
        this.paciente = paciente;
    }


    public LocalDateTime getDataHora() {
        return dataHora;
    }


    public void setDataHora(LocalDateTime dataHora) {
        this.dataHora = dataHora;
    }
}

Metodo main:

public static void main(String[] args) {
        
        Medico medico1 = new Medico();
        medico1.setNome("Dr hanzzz");
        medico1.setCrm("144443344");
        medico1.setEspecialidade("Clinico Geral");
        
        MedicoDao medicoDao = new MedicoDao();
        medicoDao.cadastrar(medico1);
//		
        Paciente paciente1 = new Paciente("Beltrano", "000.000.000-00");
        PacienteDao pacienteDao = new PacienteDao();
        pacienteDao.cadastrar(paciente1);
        
        Consulta consulta = new Consulta(LocalDateTime.of(27, 10,24, 10, 10, 0), "desc", medico1, paciente1);

        ConsultaDao consultaDao = new ConsultaDao();
        boolean aa = consultaDao.cadastrar(consulta);
    }

poderiam me ajudar a achar o erro? já tentei de várias formas e sem sucesso.. fico agradecido.

1 resposta

Olá Samuel! Tudo bem?

Vou trazer algumas análises separadas em pontos para que você verifique no contexto do seu projeto para entender melhor o está acontecendo.

  1. Verifique os Dados: Primeiro, certifique-se de que os dados (médico, paciente e data/hora) que você está passando para o método consultaExiste são os mesmos que estão armazenados no banco de dados. Qualquer pequena diferença pode fazer com que a consulta não encontre correspondências.

  2. Formato da Data/Hora: O tipo LocalDateTime pode, às vezes, causar problemas se houver diferenças de precisão entre o que está no banco e o que você está passando. Verifique se o banco de dados armazena a data/hora com a mesma precisão (milissegundos, por exemplo) que você está usando ao criar a consulta.

  3. Verificação de Identidade: Quando você compara entidades como medico e paciente, o Hibernate verifica a identidade das instâncias. Certifique-se de que as instâncias passadas para a consulta são gerenciadas pelo mesmo contexto de persistência (ou seja, são obtidas do mesmo EntityManager ou foram persistidas anteriormente).

Espero que essas dicas ajudem a resolver o problema! Se ainda encontrar dificuldades, considere compartilhar todo o seu projeto, upado no GitHub ou Drive do Google.

Bons estudos!

Caso este post tenha lhe ajudado, por favor, marcar como solucionado ✓.