Erro ao chamar Stored Procedure via Spring-boot

Fala Devs,
Estou com um pequeno problema a mais de uma semana e não consigo solucionar, seguinte, preciso fazer uma chamada à uma Stored Procedure no SQL Server utilizando o Spring Data JPA, já segui todas as opções que encontrei neste link https://www.baeldung.com/spring-data-jpa-stored-procedures, mas nenhuma resolveu meu problema, pois sempre que executo o código, obtenho esse retorno "Bind value [org.hibernate.jpa.TypedParameterValue@66ed43b0] was not of specified type [class java.lang.String".

Já conferi os tipos, tanto no código quanto na SP, e continuo recebendo o mesmo erro.

Seguem os trechos dos códigos:

SP:

CREATE PROCEDURE dbo.SP_ManterPessoaFisica 
	@PesCodigo NUMERIC,
	@PesNome VARCHAR(100), 
	@PesCpf CHAR(11), 
	@PesRg VARCHAR(100), 
	@PesRgOrgao VARCHAR(100), 
	@PesRgUf CHAR(2), 
	@PesRgDataEmissao DATE, 
	@PesNumeroTituloEleitor VARCHAR(100), 
	@PesDataEmissaoTituloEleitor DATE, 
	@PesZonaTituloEleitor VARCHAR(100), 
	@PesSecaoTituloEleitor VARCHAR(100), 
	@PesUfTituloEleitor CHAR(2), 
	@PesPassaporte VARCHAR(100), 
	@PesPaisPassaporte SMALLINT, 
	@PesDataChegadaBrasil DATE, 
	@PesNumeroReservista VARCHAR(100), 
	@PesSerieReservista VARCHAR(5), 
	@PesOrgaoReservista VARCHAR(100), 
	@PesSexo TINYINT = NULL, 
	@PesDataNascimento DATE, 
	@PesPaisNascimento SMALLINT = 22, 
	@PesUfNascimento CHAR(2),
	@PesNaturalidade VARCHAR(120), 
	@PesNacionalidade VARCHAR(100) = '22', 
	@PesEstadoCivil TINYINT = 7, 
	@PesNomePai VARCHAR(100), 
	@PesNomeMae VARCHAR(100), 
	@PesTipoSanguineo TINYINT = 0, 
	@PesCodigoEscolaridade TINYINT = 0, 
	@PesRacCodigoRacaCor TINYINT = 6, 
	@PesNecCodigoNecessidadeEspecial TINYINT = NULL, 
	@PesNumeroCarteiraTrabalho VARCHAR(100), 
	@PesSerieCarteiraTrabalho VARCHAR(100), 
	@PesUfCarteiraTrabalho CHAR(2), 
	@PesPisPasep VARCHAR(100), 
	@PesNumeroHabilitacao VARCHAR(100), 
	@PesRegistroHabilitacao VARCHAR(100),
	@PesDataEmissaoHabilitacao DATE,
	@PesDataValidadeHabilitacao DATE,
	@PesCategoriaHabilitacao VARCHAR(2),
	@PesDeficienciaFisicaHabilitacao VARCHAR(100),
	@PesPrimeiraHabilitacao DATE,
	@PesAutoCadastro BIT = 1, --Se não for informado, o auto-cadastro é por default 'true'
	@PesNomeSocial VARCHAR(100),
	@Identity INT OUTPUT
AS
BEGIN
	SET NOCOUNT ON;
    --Insert ou update
    ... 
    RETURN @Identity;
END

Service:

    private PessoaResponse manterPessoaFisica(PessoaFisica pessoa) {
        try {
            Integer retorno = this.pessoaRepository.manterPessoaFisica(
                    pessoa.getCodigoPessoa(),
                    pessoa.getNome(),
                    pessoa.getCpf(),
                    pessoa.getRg(),
                    pessoa.getRgOrgao(),
                    pessoa.getRgUf(),
                    pessoa.getRgDataEmissao(),
                    pessoa.getNumeroTituloEleitor(),
                    pessoa.getDataEmissaoTituloEleitor(),
                    pessoa.getZonaTituloEleitor(),
                    pessoa.getSecaoTituloEleitor(),
                    pessoa.getUfTituloEleitor(),
                    pessoa.getPassaporte() == null ? null : (pessoa.getPassaporte().trim().isEmpty() ? null : pessoa.getPassaporte().trim().toUpperCase()),
                    pessoa.getPaisPassaporte() != null ? pessoa.getPaisPassaporte().getPaiCodigo() : ((short) 22),
                    pessoa.getDataChegadaBrasil(),
                    pessoa.getNumeroReservista(),
                    pessoa.getSerieReservista(),
                    pessoa.getOrgaoReservista(),
                    pessoa.getSexo().getCodigo(),
                    pessoa.getDataNascimento(),
                    pessoa.getPaisNascimento() != null ? pessoa.getPaisNascimento().getPaiCodigo() : ((short) 22),
                    pessoa.getUfNascimento(),
                    pessoa.getNaturalidade(),
                    pessoa.getPaisNascimento() != null ? pessoa.getPaisNascimento().getPaiCodigo().toString() : "22", //Nacionalidade
                    pessoa.getEstadoCivil() != null ? pessoa.getEstadoCivil().getECiCodigo() : ((byte) 7),
                    pessoa.getNomePai(),
                    pessoa.getNomeMae(),
                    pessoa.getTipoSanguineo() != null ? pessoa.getTipoSanguineo().getTSaCodigo() : ((byte) 0),
                    pessoa.getEscolaridade() != null ? pessoa.getEscolaridade().getEscCodigo() : ((byte) 0),
                    pessoa.getRacaCor() != null ? pessoa.getRacaCor().getRCoCodigo() : ((byte) 6),
                    pessoa.getNecessidadeEspecial() != null ? pessoa.getNecessidadeEspecial().getnEsCodigo() : null,
                    pessoa.getNumeroCarteiraTrabalho(),
                    pessoa.getSerieCarteiraTrabalho(),
                    pessoa.getUfCarteiraTrabalho(),
                    pessoa.getPisPasep() == null ? null : (pessoa.getPisPasep().trim().isBlank() ? null : pessoa.getPisPasep().trim()),
                    pessoa.getNumeroHabilitacao(),
                    pessoa.getRegistroHabilitacao(),
                    pessoa.getDataEmissaoHabilitacao(),
                    pessoa.getDataValidadeHabilitacao(),
                    pessoa.getCategoriaHabilitacao(),
                    pessoa.getDeficienciaFisicaHabilitacao(),
                    pessoa.getPrimeiraHabilitacao(),
                    pessoa.getAutoCadastro(),
                    pessoa.getNomeSocial()
            );
            if (retorno != null) {
                int identidade = (Integer) retorno;
                if (identidade > 0) {
                    pessoa = this.pessoaRepository.findById(Long.valueOf(identidade)).get();

                    if (pessoa != null && pessoa.getCodigoPessoa() != null) {
                        return this.parseToResponse(pessoa);
                    }
                } else if (identidade == -2) {
                    throw new NegocioException("validation.data.conflict.pessoa");
                }
            }
        } catch (NegocioException e) {
            throw e;
        } catch (Exception e) {
//            LOGGER.error(e);
            throw e;
        }

        return null;
    }

Repository:

    @Procedure(procedureName = "BDPessoa.dbo.SP_ManterPessoaFisica")
    public Integer manterPessoaFisica(
            @Param(value = "PesCodigo") Long codigo,
            @Param(value = "PesNome") String nome,
            @Param(value = "PesCpf") String cpf,
            @Param(value = "PesRg") String rg,
            @Param(value = "PesRgOrgao") String rgOrgao,
            @Param(value = "PesRgUf") String rgUf,
            @Param(value = "PesRgDataEmissao") Date rgDataEmissao,
            @Param(value = "PesNumeroTituloEleitor") String numeroTituloEleitor,
            @Param(value = "PesDataEmissaoTituloEleitor") Date dataEmissaoTituloEleitor,
            @Param(value = "PesZonaTituloEleitor") String zonaTituloEleitor,
            @Param(value = "PesSecaoTituloEleitor") String secaoTituloEleitor,
            @Param(value = "PesUfTituloEleitor") String ufTituloEleitor,
            @Param(value = "PesPassaporte") String passaporte,
            @Param(value = "PesPaisPassaporte") Short paisPassaporte,
            @Param(value = "PesDataChegadaBrasil") Date dataChegadaBrasil,
            @Param(value = "PesNumeroReservista") String numeroReservista,
            @Param(value = "PesSerieReservista") String serieReservista,
            @Param(value = "PesOrgaoReservista") String orgaoReservista,
            @Param(value = "PesSexo") Byte sexo,
            @Param(value = "PesDataNascimento") Date dataNascimento,
            @Param(value = "PesPaisNascimento") Short paisNascimento,
            @Param(value = "PesUfNascimento") String ufNascimento,
            @Param(value = "PesNaturalidade") String naturalidade,
            @Param(value = "PesNacionalidade") String codigoNacionalidade,
            @Param(value = "PesEstadoCivil") Byte estadoCivil,
            @Param(value = "PesNomePai") String nomePai,
            @Param(value = "PesNomeMae") String nomeMae,
            @Param(value = "PesTipoSanguineo") Byte tipoSanguineo,
            @Param(value = "PesCodigoEscolaridade") Byte escolaridade,
            @Param(value = "PesRacCodigoRacaCor") Byte racaCor,
            @Param(value = "PesNecCodigoNecessidadeEspecial") Byte necessidadeEspecial,
            @Param(value = "PesNumeroCarteiraTrabalho") String numeroCTPS,
            @Param(value = "PesSerieCarteiraTrabalho") String serieCTPS,
            @Param(value = "PesUfCarteiraTrabalho") String ufCTPS,
            @Param(value = "PesPisPasep") String pisPasep,
            @Param(value = "PesNumeroHabilitacao") String numeroCNH,
            @Param(value = "PesRegistroHabilitacao") String registroCNH,
            @Param(value = "PesDataEmissaoHabilitacao") Date dataEmissaoCNH,
            @Param(value = "PesDataValidadeHabilitacao") Date dataValidadeCNH,
            @Param(value = "PesCategoriaHabilitacao") String categoriaCNH,
            @Param(value = "PesDeficienciaFisicaHabilitacao") String deficienciaFisicaCNH,
            @Param(value = "PesPrimeiraHabilitacao") Date primeiraHabilitacao,
            @Param(value = "PesAutoCadastro") Boolean autoCadastro,
            @Param(value = "PesNomeSocial") String nomeSocial
    );

Stracktrace (Log4j):

2022-10-19 16:53:042 ERROR [http-nio-8080-exec-5] --- org.springframework.dao.InvalidDataAccessApiUsageException: Bind value [org.hibernate.jpa.TypedParameterValue@23ab47ad] was not of specified type [class java.lang.String; nested exception is java.lang.IllegalArgumentException: Bind value [org.hibernate.jpa.TypedParameterValue@23ab47ad] was not of specified type [class java.lang.String at br.unb.webservices.db.mssql.service.PessoaFisicaService.manterPessoaFisica:670
2022-10-19 16:53:046 FATAL [http-nio-8080-exec-5] --- org.springframework.dao.InvalidDataAccessApiUsageException: Bind value [org.hibernate.jpa.TypedParameterValue@23ab47ad] was not of specified type [class java.lang.String; nested exception is java.lang.IllegalArgumentException: Bind value [org.hibernate.jpa.TypedParameterValue@23ab47ad] was not of specified type [class java.lang.String at br.unb.webservices.db.mssql.service.PessoaFisicaService.incluirPessoa:562
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Initiating transaction rollback at org.springframework.transaction.support.AbstractPlatformTransactionManager.processRollback:833
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Rolling back JPA transaction on EntityManager [SessionImpl(1642571226<open>)] at org.springframework.orm.jpa.JpaTransactionManager.doRollback:583
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- rolling back at org.hibernate.engine.transaction.internal.TransactionImpl.rollback:139
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Closing JPA EntityManager [SessionImpl(1642571226<open>)] after transaction at org.springframework.orm.jpa.JpaTransactionManager.doCleanupAfterCompletion:648
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Using @ExceptionHandler br.unb.webservices.api.exceptionhandler.ApiExceptionHandler#handleIllegalArgumentException(IllegalArgumentException, WebRequest) at org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver.doResolveHandlerMethodException:416
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Using 'application/json', given [*/*] and supported [application/json, application/*+json, application/json, application/*+json] at org.springframework.web.servlet.mvc.method.annotation.AbstractMessageConverterMethodProcessor.writeWithMessageConverters:268
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Writing [br.unb.webservices.api.model.ObjectExceptionModel@787a9164] at org.springframework.core.log.LogFormatUtils.traceDebug:119
2022-10-19 16:53:046 WARN  [http-nio-8080-exec-5] --- Resolved [java.lang.RuntimeException: org.springframework.dao.InvalidDataAccessApiUsageException: Bind value [org.hibernate.jpa.TypedParameterValue@23ab47ad] was not of specified type [class java.lang.String; nested exception is java.lang.IllegalArgumentException: Bind value [org.hibernate.jpa.TypedParameterValue@23ab47ad] was not of specified type [class java.lang.String] at org.springframework.web.servlet.handler.AbstractHandlerExceptionResolver.logException:208
2022-10-19 16:53:046 DEBUG [http-nio-8080-exec-5] --- Completed 400 BAD_REQUEST at org.springframework.web.servlet.FrameworkServlet.logResult:1131

Ao utilizar a anotação @Query com a propriedade nativeQuery=true, dessa forma:

    @Query(value = "EXECUTE BDPessoa.dbo.SP_ManterPessoaFisica :PesCodigo, :PesNome, :PesCpf, :PesRg, :PesRgOrgao, :PesRgUf, :PesRgDataEmissao, :PesNumeroTituloEleitor, :PesDataEmissaoTituloEleitor, :PesZonaTituloEleitor, :PesSecaoTituloEleitor, :PesUfTituloEleitor, :PesPassaporte, :PesPaisPassaporte, :PesDataChegadaBrasil, :PesNumeroReservista, :PesSerieReservista, :PesOrgaoReservista, :PesSexo, :PesDataNascimento, :PesPaisNascimento, :PesUfNascimento, :PesNaturalidade, :PesNacionalidade, :PesEstadoCivil, :PesNomePai, :PesNomeMae, :PesTipoSanguineo, :PesCodigoEscolaridade, :PesRacCodigoRacaCor, :PesNecCodigoNecessidadeEspecial, :PesNumeroCarteiraTrabalho, :PesSerieCarteiraTrabalho, :PesUfCarteiraTrabalho, :PesPisPasep, :PesNumeroHabilitacao, :PesRegistroHabilitacao, :PesDataEmissaoHabilitacao, :PesDataValidadeHabilitacao, :PesCategoriaHabilitacao, :PesDeficienciaFisicaHabilitacao, :PesPrimeiraHabilitacao, :PesAutoCadastro, :PesNomeSocial, :Identity OUTPUT", nativeQuery = true)
    public int manterPessoaFisica(
            @Param(value = "PesCodigo") Long codigo,
            @Param(value = "PesNome") String nome,
            @Param(value = "PesCpf") String cpf,
            @Param(value = "PesRg") String rg,
            @Param(value = "PesRgOrgao") String rgOrgao,
            @Param(value = "PesRgUf") String rgUf,
            @Param(value = "PesRgDataEmissao") Date rgDataEmissao,
            @Param(value = "PesNumeroTituloEleitor") String numeroTituloEleitor,
            @Param(value = "PesDataEmissaoTituloEleitor") Date dataEmissaoTituloEleitor,
            @Param(value = "PesZonaTituloEleitor") String zonaTituloEleitor,
            @Param(value = "PesSecaoTituloEleitor") String secaoTituloEleitor,
            @Param(value = "PesUfTituloEleitor") String ufTituloEleitor,
            @Param(value = "PesPassaporte") String passaporte,
            @Param(value = "PesPaisPassaporte") Short paisPassaporte,
            @Param(value = "PesDataChegadaBrasil") Date dataChegadaBrasil,
            @Param(value = "PesNumeroReservista") String numeroReservista,
            @Param(value = "PesSerieReservista") String serieReservista,
            @Param(value = "PesOrgaoReservista") String orgaoReservista,
            @Param(value = "PesSexo") Byte sexo,
            @Param(value = "PesDataNascimento") Date dataNascimento,
            @Param(value = "PesPaisNascimento") Short paisNascimento,
            @Param(value = "PesUfNascimento") String ufNascimento,
            @Param(value = "PesNaturalidade") String naturalidade,
            @Param(value = "PesNacionalidade") String codigoNacionalidade,
            @Param(value = "PesEstadoCivil") Byte estadoCivil,
            @Param(value = "PesNomePai") String nomePai,
            @Param(value = "PesNomeMae") String nomeMae,
            @Param(value = "PesTipoSanguineo") Byte tipoSanguineo,
            @Param(value = "PesCodigoEscolaridade") Byte escolaridade,
            @Param(value = "PesRacCodigoRacaCor") Byte racaCor,
            @Param(value = "PesNecCodigoNecessidadeEspecial") Byte necessidadeEspecial,
            @Param(value = "PesNumeroCarteiraTrabalho") String numeroCTPS,
            @Param(value = "PesSerieCarteiraTrabalho") String serieCTPS,
            @Param(value = "PesUfCarteiraTrabalho") String ufCTPS,
            @Param(value = "PesPisPasep") String pisPasep,
            @Param(value = "PesNumeroHabilitacao") String numeroCNH,
            @Param(value = "PesRegistroHabilitacao") String registroCNH,
            @Param(value = "PesDataEmissaoHabilitacao") Date dataEmissaoCNH,
            @Param(value = "PesDataValidadeHabilitacao") Date dataValidadeCNH,
            @Param(value = "PesCategoriaHabilitacao") String categoriaCNH,
            @Param(value = "PesDeficienciaFisicaHabilitacao") String deficienciaFisicaCNH,
            @Param(value = "PesPrimeiraHabilitacao") Date primeiraHabilitacao,
            @Param(value = "PesAutoCadastro") Boolean autoCadastro,
            @Param(value = "PesNomeSocial") String nomeSocial,
            @Param(value = "Identity") Integer identity
    );

Obtenho o seguinte retorno:

...
Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.RuntimeException: org.springframework.orm.jpa.JpaSystemException: could not extract ResultSet; nested exception is org.hibernate.exception.GenericJDBCException: could not extract ResultSet] with root cause at org.apache.juli.logging.DirectJDKLog.log:175
com.microsoft.sqlserver.jdbc.SQLServerException: A instrução não retornou um conjunto de resultados.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:237) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.doExecutePreparedStatement(SQLServerPreparedStatement.java:626) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement$PrepStmtExecCmd.doExecute(SQLServerPreparedStatement.java:537) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.TDSCommand.execute(IOBuffer.java:7730) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerConnection.executeCommand(SQLServerConnection.java:3786) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeCommand(SQLServerStatement.java:268) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerStatement.executeStatement(SQLServerStatement.java:242) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.executeQuery(SQLServerPreparedStatement.java:456) ~[mssql-jdbc-10.2.1.jre8.jar:?]
	at com.zaxxer.hikari.pool.ProxyPreparedStatement.executeQuery(ProxyPreparedStatement.java:52) ~[HikariCP-4.0.3.jar:?]
	at com.zaxxer.hikari.pool.HikariProxyPreparedStatement.executeQuery(HikariProxyPreparedStatement.java) ~[HikariCP-4.0.3.jar:?]
	at org.hibernate.engine.jdbc.internal.ResultSetReturnImpl.extract(ResultSetReturnImpl.java:57) ~[hibernate-core-5.6.11.Final.jar:5.6.11.Final]
...

Porém, a SP está definida corretamente, tem um parâmetro de retorno e não obtenho a resposta…

Agradeço desde já qualquer ajuda.

Pessoal consegui resolver essa questão, acontece que o Spring pede que a SP retorne algum objeto (acredito que seja alguma configuração - que não encontrei), então, alterei a SP para que retornasse o objeto incluído/alterado por meio de um SELECT no banco de dados, e alterei o retorno do método para receber o mesmo tipo, desse modo:

@Query(...)
public PessoaFisica manterPessoaFisica(...)

Assim, além de realizar a persistência, obtive o retorno desejado.

Fica aqui o registro pra quem passar pelo mesmo problema.