Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro ao validar se pessoa vinculada ao profissional já existe

Estou fazendo uma vinculação onde possuo o cadastro de pessoa e para cadastrar o meu profissional eu busco os dados do cadastro de pessoas. Até ai tudo bem. Porém quando vou fazer a validação se a pessoa já existe como profissional estou recebendo a seguinte exceção:

java.lang.IllegalArgumentException: Argument [2] of type [java.lang.Long] did not match parameter type [br.com.nsistemas.apiclinica.pessoa.Pessoa (n/a)]

No meu repository, fiz a busca da seguinte forma:

public interface ProfissionalRepository extends JpaRepository<Profissional, Long> {

    @Query("""
            select p
            from Profissional p
            where 
            p.id_pessoa = :id_pessoa
            """)
    Pessoa findByPessoa(Long id_pessoa);
}

O meu service esta da seguinte forma:

public DadosDetalhamentoProfissional salvar(DadosCadastroProfissional dados) {
        if (!pessoaRepository.existsById(dados.id_pessoa()) )  {
            throw new ValidacaoException("A pessoa selecionada não existe.");
        }
        var verificaPessoaProfissional = profissionalRepository.findByPessoa(dados.id_pessoa());

        if (verificaPessoaProfissional != null) {
            throw new ValidacaoException("Esta pessoa já é um profissional.");
        }

        var pessoa = pessoaRepository.getReferenceById(dados.id_pessoa());

        var addProfissional = profissionalRepository.save(new Profissional(null, pessoa, dados.carteira_profissional(),
                dados.observacao(), true, dados.data_admissao(), null));

        return new DadosDetalhamentoProfissional(addProfissional);
    }

O meu DTO:

public record DadosCadastroProfissional(
        @NotNull
        Long id_pessoa,
        @NonNull
        String carteira_profissional,
        String observacao,
        Boolean status,
        @NotNull
        LocalDateTime data_admissao,
        LocalDateTime data_desligamento) {
}

Quando eu retiro a validação, salva normalmente. Alguém poderia me ajudar?

1 resposta
solução!

Olá Natali, tudo bem?

Pelo que entendi, você está tentando validar se a pessoa já é um profissional antes de cadastrá-la como tal, correto? O erro que você está recebendo indica que o tipo do argumento passado para o método findByPessoa não está correto, já que ele espera receber um objeto do tipo Pessoa, mas você está passando um Long. Se você quiser utilizar o ID o método não pode chamar findByPessoa, deveria ser findById.

Você também pode utilizar a anotação @Param na sua query para indicar qual parâmetro está sendo passado.

Ficaria assim:

public interface ProfissionalRepository extends JpaRepository<Profissional, Long> {

    @Query("""
            select p
            from Profissional p
            where 
            p.pessoa.id = :id_pessoa
            """)
    Profissional findByPessoa(@Param("id_pessoa") Long id_pessoa);
}

E no seu service:

var verificaPessoaProfissional = profissionalRepository.findByPessoa(dados.id_pessoa());

if (verificaPessoaProfissional != null) {
    throw new ValidacaoException("Esta pessoa já é um profissional.");
}

Espero ter ajudado e bons estudos!