Erro ao tentar chamar procedure

1 resposta Resolvido
sqlserverjavaspring-bootjpa
B

Olá Devs,
Estou trabalhando com Spring-boot e descobri que existe uma anotação para uso de procedures no banco de dados, @Procedure, que colocamos na Repository, segue o código:

@Procedure(procedureName = "sp_Inserir_PessoaLegado")
    public Integer pessoaIncluirLegado(
            @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") LocalDate rgDataEmissao,
//    outros parâmetros
);

Mas o meu código lança a seguinte exceção quanto tento chamar essa procedure no banco de dados:

Caused by: org.hibernate.exception.GenericJDBCException: Error preparing registered callable parameter
	at org.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:47) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
	at org.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:113) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
	at org.hibernate.procedure.internal.ProcedureCallImpl$3.accept(ProcedureCallImpl.java:406) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
	at org.hibernate.procedure.internal.ProcedureCallImpl$3.accept(ProcedureCallImpl.java:390) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
... 84 more
Caused by: com.microsoft.sqlserver.jdbc.SQLServerException: O índice 60 está fora do intervalo.
	at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDriverError(SQLServerException.java:234) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setterGetParam(SQLServerPreparedStatement.java:1115) ~[mssql-jdbc-9.2.1.jre8.jar:?]
	at com.microsoft.sqlserver.jdbc.SQLServerPreparedStatement.setValue(SQLServerPreparedStatement.java:1129) ~[mssql-jdbc-9.2.1.jre8.jar:?]
...

Por experiência eu sei que o índice 60 pode ser algum parâmetro a mais com relação ao que existe na procedure, porém, já verifiquei isso e todos os parâmetros estão listados.
Então, gostaria da ajuda de vocês, principalmente de quem já utilizou esse recurso do Spring alguma vez.

Desde já agradeço.

1 Resposta

B
Solucao aceita

Hey Devs, encontrei uma solução para isso, estou passando para deixar registrado caso alguém passe pelo mesmo problema no futuro.
Não sei se é algum bug na anotação @Procedure, mas mesmo excluindo ou adicionando parâmetros, sempre retorna o mesmo erro, então utilizei a anotação @Query juntamente com o atributo nativeQuery = true, isso me permitiu executar a SP sem maiores problemas, e ainda pude capturar seu retorno preenchendo diretamente o objeto de retorno. Ficou assim o código:

@Query(value = "EXEC Sipes.dbo.sp_Inserir_PessoaLegado :PesNome, :PesCpf, :PesRg, :PesRgOrgao, :PesRgUf, :PesRgDataEmissao, :PesNumeroTituloEleitor, :PesDataEmissaoTituloEleitor, :PesZonaTituloEleitor, :PesSecaoTituloEleitor, :PesUfTituloEleitor, :PesPassaporte, :PesPaisPassaporte, :PesDataChegadaBrasil, :PesNumeroReservista, :PesSerieReservista, :PesOrgaoReservista, :PesSexo, :PesDataNascimento, :PesPaisNascimento, :PesUfNascimento, :PesNaturalidade, :PesNacionalidade, :PesEstadoCivil, :PesEndereco, :PesComplementoEndereco, :PesBairro, :PesCidade, :PesUf, :PesCep, :PesCaixaPostal, :EndPais, :PesDDD, :PesTelefone, :PesCelular, :PesFax, :PesEmail, :PesEmailInstitucional, :PesNomePai, :PesNomeMae, :PesTipoSanguineo, :PesCodigoEscolaridade, :PesRacCodigoRacaCor, :PesNecCodigoNecessidadeEspecial, :PesNumeroCarteiraTrabalho, :PesSerieCarteiraTrabalho, :PesUfCarteiraTrabalho, :PesPisPasep, :PesNumeroHabilitacao, :PesRegistroHabilitacao, :PesDataEmissaoHabilitacao, :PesDataValidadeHabilitacao, :PesCategoriaHabilitacao, :PesDeficienciaFisicaHabilitacao, :PesPrimeiraHabilitacao, :PesAutoCadastro, :PesNomeSocial, :Simulacao", nativeQuery = true)
    public Pessoa pessoaIncluirLegado(
            @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") LocalDate rgDataEmissao,
//    outros parâmetros
);
Criado 7 de dezembro de 2021
Ultima resposta 20 de dez. de 2021
Respostas 1
Participantes 1