Jump to content

Erro ao chamar Stored Procedure, uso spring boot e JPA; Sou iniciante no Java e estou penando muito, alguém pode me ajudar com essa bronca.


Postagens Recomendadas

MODEL -----------------------------------------
package com.procedures.pjProcedure.model;

import lombok.Getter;
import lombok.Setter;

import javax.persistence.Column;
import javax.persistence.Entity;
import javax.persistence.Id;
import javax.persistence.Table;

@Getter
@Setter
@Entity
@Table(name="tb_especialidades")
public class Especialidade {
    @Id
    @Column(name="esp_codigo")
    private Long codigo;
    @Column(name="esp_descricao")
    private String descricao;
    @Column(name="esp_nome_reduzido")
    private String nomeReduzido;

}
REPOSITORY---------------------------------------------
package com.procedures.pjProcedure.repository;

import com.procedures.pjProcedure.model.Especialidade;
import org.springframework.data.jpa.repository.JpaRepository;

public interface EspecialidadeRepository extends JpaRepository<Especialidade, Long> {

}
SERVICE--------------------------------------
package com.procedures.pjProcedure.service;

import com.procedures.pjProcedure.repository.EspecialidadeRepository;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.jdbc.object.StoredProcedure;
import org.springframework.stereotype.Service;

import javax.persistence.Entity;
import javax.persistence.EntityManager;
import javax.persistence.StoredProcedureQuery;

@Service
public class EspecialidadeService {

    @Autowired
    private EspecialidadeRepository er;

    public void executaProcedure(EntityManager em){
        StoredProcedureQuery spq = em.createStoredProcedureQuery("spesp01");
        spq.execute();
    }

}

RESOURCE---------------------------------------------
package com.procedures.pjProcedure.resource;

import com.procedures.pjProcedure.model.Especialidade;
import com.procedures.pjProcedure.repository.EspecialidadeRepository;
import com.procedures.pjProcedure.service.EspecialidadeService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import javax.persistence.EntityManager;
import javax.persistence.EntityManagerFactory;
import javax.persistence.Persistence;
import java.util.List;

@RestController
@RequestMapping("/especialidades")
public class EspecialidadeResource {

    @Autowired
    private EspecialidadeRepository er;
    @Autowired
    private EspecialidadeService es;

    @GetMapping("/listar")
    public List<Especialidade> Listar(){
        return er.findAll();
    }

    @PostMapping("/exeProcedure")
    public void exeProcedure(){
        EntityManagerFactory emf = Persistence
                .createEntityManagerFactory("spesp01");
        EntityManager em = emf.createEntityManager();
        es.executaProcedure(em);
    }

}
MINHA TABELA NO POSTGRESQL---------------------------
create sequence esp_id_seq
    START WITH 1;

create table tb_especialidades (
    esp_codigo         bigint not null default nextval('esp_id_seq'),
    esp_descricao      varchar(100),
    esp_nome_reduzido  varchar(15),
    primary key (esp_codigo)
);

MINHA STORED PROCEDURE SPESP01()----------------------

CREATE OR REPLACE PROCEDURE public.spesp01()
    LANGUAGE 'plpgsql'
    
AS $BODY$
BEGIN
    
    update tb_especialidades
    set ESP_NOME_REDUZIDO='tst03' 
    WHERE ESP_CODIGO=3;
    COMMIT;

END;
$BODY$;
--------------------------------------------------------
 

DEPURACAO.txt

Link to comment
Compartilhe em outros sites

Bom dia Jotahemmy Silva, tudo bem?

Não sou nenhum especialista em Spring mas acho que posso te ajudar.

Tenta da seguinte forma:

Vamos começar pelo repositório:

public interface EspecialidadeRepository extends JpaRepository<Especialidade, Long> {

@Procedure("public.spesp01()")
    void spesp01();

}

 

No seu  Service:

@Service
public class EspecialidadeService {

    @Autowired
    private EspecialidadeRepository er;

    public void executaProcedure(EntityManager em){
         er.spesp01();
    }

 

No seu Controller:

    @PostMapping("/exeProcedure")
    public void exeProcedure(){
        es.executaProcedure();
    }

 

Se você está usando Spring boot com JPA você não precisa criar um EntityManager pois ele já é fornecido pelo Spring Data JPA.

 

Espero ter ajudado!

 

 

 

 

Link to comment
Compartilhe em outros sites

Olá nosso amigo, foram feitas as alterações, porém continua com erro: 

ERROR: public.spesp01() is a procedure
  Dica: To call a procedure, use CALL.

NO Repository
----------------
    @Procedure("public.spesp01")
    void spesp01();

No Service
----------------
    public void executaProcedure(){
          especialidadeRepository.spesp01();
      }

No Controller      
----------------

    @PostMapping("/exeProcedure")
    public void exeProcedure(){
        especialidadeService.executaProcedure();
    }


erro
----------------

...

2022-05-09 02:25:42.396  INFO 10492 --- [  restartedMain] c.c.s.SyscoopmedrnapiApplication         : Started SyscoopmedrnapiApplication in 5.252 seconds (JVM running for 5.67)
2022-05-09 02:25:47.966  INFO 10492 --- [nio-8080-exec-2] o.a.c.c.C.[Tomcat].[localhost].[/]       : Initializing Spring DispatcherServlet 'dispatcherServlet'
2022-05-09 02:25:47.966  INFO 10492 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Initializing Servlet 'dispatcherServlet'
2022-05-09 02:25:47.967  INFO 10492 --- [nio-8080-exec-2] o.s.web.servlet.DispatcherServlet        : Completed initialization in 0 ms
Hibernate: {call public.spesp01()}
2022-05-09 02:25:48.043  WARN 10492 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42809
2022-05-09 02:25:48.046 ERROR 10492 --- [nio-8080-exec-2] o.h.engine.jdbc.spi.SqlExceptionHelper   :

ERROR: public.spesp01() is a procedure
  Dica: To call a procedure, use CALL.

 

  Posição: 15
2022-05-09 02:25:48.062 ERROR 10492 --- [nio-8080-exec-2] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessResourceUsageException: Error calling CallableStatement.getMoreResults; SQL [public.spesp01]; nested exception is org.hibernate.exception.SQLGrammarException: Error calling CallableStatement.getMoreResults] with root cause

org.postgresql.util.PSQLException: ERROR: public.spesp01() is a procedure
  Dica: To call a procedure, use CALL.
  Posição: 15
    at org.postgresql.core.v3.QueryExecutorImpl.receiveErrorResponse(QueryExecutorImpl.java:2552) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.core.v3.QueryExecutorImpl.processResults(QueryExecutorImpl.java:2284) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.core.v3.QueryExecutorImpl.execute(QueryExecutorImpl.java:322) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.jdbc.PgStatement.executeInternal(PgStatement.java:481) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.jdbc.PgStatement.execute(PgStatement.java:401) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.jdbc.PgPreparedStatement.executeWithFlags(PgPreparedStatement.java:164) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.jdbc.PgCallableStatement.executeWithFlags(PgCallableStatement.java:83) ~[postgresql-42.2.23.jar:42.2.23]
    at org.postgresql.jdbc.PgPreparedStatement.execute(PgPreparedStatement.java:153) ~[postgresql-42.2.23.jar:42.2.23]
    at com.zaxxer.hikari.pool.ProxyPreparedStatement.execute(ProxyPreparedStatement.java:44) ~[HikariCP-4.0.3.jar:na]
    at com.zaxxer.hikari.pool.HikariProxyCallableStatement.execute(HikariProxyCallableStatement.java) ~[HikariCP-4.0.3.jar:na]
    at org.hibernate.result.internal.OutputsImpl.<init>(OutputsImpl.java:56) ~[hibernate-core-5.4.32.Final.jar:5.4.32.Final]
    at org.hibernat
    
    
...
 

Link to comment
Compartilhe em outros sites

Crie uma conta ou entre para comentar 😀

Você precisa ser um membro para deixar um comentário.

Crie a sua conta

Participe da nossa comunidade, crie sua conta.
É bem rápido!

Criar minha conta agora

Entrar

Você já tem uma conta?
Faça o login agora.

Entrar agora
  • Quem está online   0 Membros, 0 Anônimos, 30 Visitantes (Ver lista completa)

    • There are no registered users currently online


×
×
  • Create New...