2
respostas

Erro de Validação Spring

Olá, pessoas, tudo bem? Sigo no meu sofrimento diário de aprender Spring (kkkkkk), estou com um erro chato há dias e simplesmente não sei mais onde posso debugar

O erro em questão é:

Specified result type [boolean] did not match Query selection type [med.voll.api.domain.patient.Patient] - multiple selections: use Tuple or array

Depois de horas debugando, eu vi que provavelmente o erro vem de uma query que era pra retornar um boolean, mas não está chegando no formato correto.

A função em questão é uma query com a convenção de nomenclatura pra criar queries JPQL:

    boolean existsByPatientIdAndDataBetween(Long id, LocalDateTime opening, LocalDateTime close);

Essa query é realizada dentro de um component de uma service:

@Component
public class sameDataPatientScheduleValidation implements ValidateConsultSchedule  {

    @Autowired
    private ConsultScheduleRepository repository;
    
    public void validate(dataConsultSchedule data) {
        LocalDateTime opening = data.data().withHour(7);
        LocalDateTime close = data.data().withHour(18);
        boolean patientHasSameSchedule = repository.existsByPatientIdAndDataBetween(data.patient_id(), opening, close);

        if(patientHasSameSchedule) {
            throw new ValidationException("A patient has occupied this schedule");
        }
    }
}

Eu acho que o erro está aí pois é a única validação que necessita obrigatoriamente de uma verificação dentro de um Patient, além de que a query talvez possa estar retornando uma lista de resultados ao invés de converter pra boolean.

2 respostas

E aí, Pedro! Beleza?

Cara, olhando seu código, parece que o Spring tá meio confuso com o tipo de retorno da sua query, saca? A mensagem de erro fala que o tipo especificado é boolean, mas a seleção da query tá esperando um tipo Patient, e isso tá causando o rolo.

Dá uma olhada na sua query:

boolean existsByPatientIdAndDataBetween(Long id, LocalDateTime opening, LocalDateTime close);

Acho que o Spring tá esperando que essa query retorne um boolean, mas ela tá meio ambígua, sabe? Como tá rolando um "existsBy", talvez ele espere um tipo de resultado diferente. Tenta mudar o tipo de retorno da query pra List ou algo do tipo, tipo assim:

List<Patient> existsByPatientIdAndDataBetween(Long id, LocalDateTime opening, LocalDateTime close);

E aí no seu validate, vê se o resultado não tá vindo como uma lista e tenta ajustar isso. Fica de olho também na parte que lança a exceção, pra não causar confusão com o tipo.

Eu mudei tanto pra List quanto para Tuple, e adaptei a condicional, mas mesmo assim o erro persiste. Eu estava pensando até que não poderia ser nessa query, mas é, realmente, a única que usa o Patient para fazer uma busca.