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.