4
respostas

Native query

Eu gostaria de utilizar native querys no lugar de JPQL quando tento usar para fazer o agendamente retornao seguinte erro:2023-08-18T13:58:52.048-03:00 ERROR 7192 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet] : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.JdbcMapping.getJdbcValueBinder()" because "jdbcMapping" is null] with root cause

java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.JdbcMapping.getJdbcValueBinder()" because "jdbcMapping" is null

Aqui o codigo do AgendamentoRepository

package med.voll.api.domain.medico;

import java.time.LocalDateTime;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.data.jpa.repository.Query;


public interface MedicoRepository extends JpaRepository<Medico, Long> {

    Page<Medico> findAllByAtivoTrue(Pageable paginacao);
    @Query(value="select * from medicos where especialidade = :especialidade and ativo = 1 and medicos.id not in(select medicos.id from consultas where consultas.data = :data) order by rand() limit 1",nativeQuery = true)
    Medico findRandomMedico(Especialidade especialidade, LocalDateTime data);

}
4 respostas

Oi!

Talvez o problema seja a consulta. Acredito que em SQL puro ela deveria estar assim:

select * from medicos where especialidade = :especialidade and ativo = 1 and id not in(select medico_id from consultas where data = :data) order by rand() limit 1

Tentei utilizar esta query mas continua retornando o mesmo erro, ja testei as duas no mysql e as duas funcionam normalmente

Acho que o problema então são os parâmetros da query. Tenta anotar os parâmetros:

Medico findRandomMedico(@Param("especialidade") Especialidade especialidade, @Param("data") LocalDateTime data);

Se não funcionar, altere para parâmetro posicional:

@Query(value = "select * from medicos where especialidade = ?1 and ativo = 1 and id not in(select medico_id from consultas where data = ?2) order by rand() limit 1", nativeQuery = true)
Medico findRandomMedico(Especialidade especialidade, LocalDateTime data);

Testei das duas formas e ainda assim não funciona, ele chega fazer a consulta:

Hibernate: 
    select
        u1_0.id,
        u1_0.login,
        u1_0.senha 
    from
        usuarios u1_0 
    where
        u1_0.login=?
Hibernate: 
    select
        count(*) 
    from
        pacientes p1_0 
    where
        p1_0.id=?
Hibernate: 
    select
        * 
    from
        medicos 
    where
        especialidade = ? 
        and ativo = 1 
        and id not in(select
            medico_id 
        from
            consultas 
        where
            data = ?) 
    order by
        rand() limit 1
2023-08-18T14:54:18.456-03:00 ERROR 12024 --- [nio-8080-exec-1] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed: java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.JdbcMapping.getJdbcValueBinder()" because "jdbcMapping" is null] with root cause

java.lang.NullPointerException: Cannot invoke "org.hibernate.metamodel.mapping.JdbcMapping.getJdbcValueBinder()" because "jdbcMapping" is null
    at org.hibernate.sql.exec.internal.AbstractJdbcParameter.bindParameterValue(AbstractJdbcParameter.java:108) ~[hibernate-core-6.1.5.Final.jar:6.1.5.Final]