Solucionado (ver solução)
Solucionado
(ver solução)
2
respostas

Erro ao limitar o retorno de médicos ativo e com data disponivel

Bom dia pessoal. Ao realizar o cadastro de Consultas, a Query para selecionar um médico aleatório com base na especialidade passada me retorna um erro por conta do limit = 1. Como posso fazer para contornar esse problema? Segue abaixo o medicoRepository:

public interface MedicoRepository extends JpaRepository<MedicoModel, Long> {
    Page<MedicoModel> findAllByAtivoTrue(Pageable paginacao);

    @Query("select m from Medico m where m.ativo = true and m.especialidade = :especialidade and m.id not in (select c.medico.id from Consulta c where c.data = :data) order by rand() limit = 1")
    MedicoModel escolherMedicoAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data);

}


Caused by: org.springframework.data.repository.query.QueryCreationException: Could not create query for public abstract med.voll.api.models.medicos.MedicoModel med.voll.api.models.medicos.MedicoRepository.escolherMedicoAleatorioLivreNaData(med.voll.api.utils.Especialidade,java.time.LocalDateTime,double)! Reason: Using named parameters for method public abstract med.voll.api.models.medicos.MedicoModel med.voll.api.models.medicos.MedicoRepository.escolherMedicoAleatorioLivreNaData(med.voll.api.utils.Especialidade,java.time.LocalDateTime,double) but parameter 'Optional[limit]' not found in annotated query 'SELECT m FROM Medico m WHERE m.ativo = true AND m.especialidade = :especialidade AND m.id NOT IN (SELECT c.medico.id FROM Consulta c WHERE c.data = :data) order by rand() limit 1'!; nested exception is java.lang.IllegalStateException: Using named parameters for method public abstract med.voll.api.models.medicos.MedicoModel med.voll.api.models.medicos.MedicoRepository.escolherMedicoAleatorioLivreNaData(med.voll.api.utils.Especialidade,java.time.LocalDateTime,double) but parameter 'Optional[limit]' not found in annotated query 'SELECT m FROM Medico m WHERE m.ativo = true AND m.especialidade = :especialidade AND m.id NOT IN (SELECT c.medico.id FROM Consulta c WHERE c.data = :data) order by rand() limit 1'!
2 respostas
solução!

Olá, Samuel! Espero que esteja tudo bem.

No JPA, a cláusula limit não é suportada diretamente nas consultas JPQL. Mas não se preocupe, temos uma solução alternativa para isso.

Você pode usar o método setMaxResults(1) do objeto Query para limitar o resultado a apenas um registro. Para isso, você precisará modificar sua consulta e seu método para retornar uma lista de MedicoModel e, em seguida, pegar o primeiro resultado.

Aqui está um exemplo de como você pode fazer isso:

public interface MedicoRepository extends JpaRepository<MedicoModel, Long> {
    Page<MedicoModel> findAllByAtivoTrue(Pageable paginacao);

    @Query("select m from Medico m where m.ativo = true and m.especialidade = :especialidade and m.id not in (select c.medico.id from Consulta c where c.data = :data) order by rand()")
    List<MedicoModel> escolherMedicoAleatorioLivreNaData(Especialidade especialidade, LocalDateTime data, Pageable pageable);
}

E ao chamar o método, você pode passar um objeto Pageable com o tamanho da página definido como 1:

Pageable pageable = PageRequest.of(0, 1);
List<MedicoModel> medicos = medicoRepository.escolherMedicoAleatorioLivreNaData(especialidade, data, pageable);
MedicoModel medicoAleatorio = medicos.isEmpty() ? null : medicos.get(0);

Dessa forma, você estará limitando o resultado da consulta a apenas um registro.

Espero ter ajudado e bons estudos!

Resolvido Sarah, muito obrigado pela atenção.