Ошибка при вызове хранимой процедуры в PostGreSQL из Spring Boot - PullRequest
0 голосов
/ 05 марта 2020

Я пытаюсь вызвать хранимую процедуру, используя SpringBoot 2.1.7.RELEASE, JPA 2.1 и PostGreSQL База данных. Я получаю приведенную ниже ошибку при вызове хранимой процедуры:

Причина: org.hibernate.exception.SQLGrammarException: ошибка при вызове CallableStatement.getMoreResults в org.hibernate.exception.internal.SQLStateConversionDelegate.convert (SQLStateConversionDelegate. 1022 *: 106) в org.hibernate.exception.internal.StandardSQLExceptionConverter.convert (StandardSQLExceptionConverter. java: 42) в org.hibernate.engine.jdb c .spi.SqlExceptionHelper.convert (SqlException25elper: SqlException25elper: 113) в org.hibernate.result.internal.OutputsImpl.convert (OutputsImpl. java: 83) в org.hibernate.result.internal.OutputsImpl. (OutputsImpl. java: 60) в org.hibernate.procedure. internal.ProcedureOutputsImpl. (ПроцедураOutputsImpl. java: 34) в org.hibernate.procedure.internal.ProcedureCallImpl.buildOutputs (ПроцедураCallImpl. java: 415) в org.hibernate.procedure.internal.ProcedureCallImpl. 1030 *: 351) в org.hibernate.procedure.internal.ProcedureCallImpl.outputs (Процедура eCallImpl. java: 631) в org.hibernate.procedure.internal.ProcedureCallImpl.execute (ПроцедураCallImpl. java: 614) ... еще 48 Причин: org. postgresql .util.PSQLException: ОШИБКА: balancemanagement2 (целое число, двойная точность) - это процедура Подсказка: чтобы вызвать процедуру, используйте CALL. Позиция: 15 в орг. postgresql .core.v3.QueryExecutorImpl.receiveErrorResponse (QueryExecutorImpl. java: 2468) в орг. postgresql .core.v3.QueryExecutorImpl.processResults (QueryExecutorImpl. * 1037) в 1037 org. postgresql .core.v3.QueryExecutorImpl.execute (QueryExecutorImpl. java: 309) в org. postgresql .jdb c .PgStatement.executeInternal (PgStatement. java: 446) в орг. postgresql .jdb c .PgStatement.execute (PgStatement. java: 370) в org. postgresql .jdb c .PgPreparedStatement.executeWithFlags (PgPreparedStatement. java: 149) в орг. .jdb c .PgCallableStatement.executeWithFlags (PgCallableStatement. java: 77) в org. postgresql .jdb c .PgPreparedStatement.execute (PgPreparedStatement. java: 13x). com.h). .ProxyPreparedStatement.execute (ProxyPreparedStatement. java: 44) в com.zaxxer.hikari.pool.HikariProxyCallableStatement.execute (HikariProxyCallableStatement. java) в org.hibernate.result.Imp.Impl. Inmp. 56)

Ниже приведен соответствующий код. Любая помощь будет приветствоваться.

Хранимая процедура

CREATE OR REPLACE PROCEDURE balanceManagement2(IN articleId INT,IN amount double precision)
LANGUAGE plpgsql    
AS $$
BEGIN
    UPDATE article_master 
    SET balance = balance + amount
    WHERE article_id = articleId;
    COMMIT;
END;
$$;   

pom. xml

<parent>
        <groupId>org.springframework.boot</groupId>
        <artifactId>spring-boot-starter-parent</artifactId>
        <version>2.1.7.RELEASE</version>
        <relativePath /> <!-- lookup parent from repository -->
    </parent>
    <groupId>com.spring.jpa</groupId>
    <artifactId>SpringBootJPA</artifactId>
    <version>0.0.1-SNAPSHOT</version>
    <name>SpringBootJPA</name>
    <description>Demo project for Spring Boot</description>

    <properties>
        <java.version>1.8</java.version>
    </properties>

    <dependencies>

        <!-- Web -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-web</artifactId>
        </dependency>

        <!-- JPA , including Hikari CP -->
        <dependency>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-data-jpa</artifactId>
        </dependency>
        <dependency>
            <groupId>org.eclipse.persistence</groupId>
            <artifactId>javax.persistence</artifactId>
            <version>2.1.0</version>
        </dependency>

        <!-- Hibernate -->
        <dependency>
            <groupId>org.hibernate</groupId>
            <artifactId>hibernate-core</artifactId>
        </dependency>

        <!-- PostGreSQL -->
        <dependency>
            <groupId>org.postgresql</groupId>
            <artifactId>postgresql</artifactId>
        </dependency>

Entity

@Entity
@Table(name="article_master")
@Getter
@Setter
@NamedStoredProcedureQueries({
    @NamedStoredProcedureQuery(name = "balanceManagement2", 
                               procedureName = "balanceManagement2",
                               parameters = {
                                       @StoredProcedureParameter(mode=ParameterMode.REF_CURSOR, type = void.class),
                                       @StoredProcedureParameter(mode=ParameterMode.IN,type=Integer.class),
                                       @StoredProcedureParameter(mode=ParameterMode.IN,type= Double.class)
                               })
})
public class Article {

    @Id
    @GeneratedValue(strategy=GenerationType.AUTO)
    private Integer articleId;

    @Column(name="article_name")
    private String articleName;

    @Column(name="author")
    private String author;

    @Column(name="balance")
    private Double balance;

}

Хранилище

@Repository
@Transactional
public interface ArticleRepository extends JpaRepository<Article, Integer>, ArticleRepositoryCustom{

}

public interface ArticleRepositoryCustom {
    public void balanceManagement2(Integer articleId, Double amount);
}

public class ArticleRepositoryCustomImpl implements ArticleRepositoryCustom {

    @PersistenceContext
    private EntityManager entityManager;

    @Override
    public void balanceManagement2(Integer articleId, Double amount) {

        try {
            StoredProcedureQuery storedProcedureQuery = 
                     entityManager
                    .createNamedStoredProcedureQuery("balanceManagement2")
                    .setParameter(2, articleId)
                    .setParameter(3, amount);

            storedProcedureQuery.execute();

        }catch (Exception e) {
            e.printStackTrace();
            throw e;
        }
    }

}


Сервис

public void balanceManagement2(Integer articleId, Double amount) {
        try {
            articleRepository.balanceManagement2(articleId, amount);
            System.out.println("Stored Procedure balanceManagement executed successfully...");
        }catch (Exception e) {
            e.printStackTrace();
        }
    }

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...