Я пытаюсь вызвать хранимую процедуру, используя 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();
}
}