Can't call PostgreSQL's 11 Stored Procedure with Hibernate Can't call PostgreSQL's 11 Stored Procedure with Hibernate postgresql postgresql

Can't call PostgreSQL's 11 Stored Procedure with Hibernate


As the pgJDBC 42.2.5 was released prior (Aug, 2018) to the PostgreSQL 11 release (Oct, 2018), I think this is currently a issue within the JDBC driver for PostgreSQL itself. I've created a issue within the GitHub repository.

For a workaround, you could rewrite the STORED PROCEDURE as a FUNCTION and use @NamedStoredProcedureQuery or directly interact with the JDBC CallableStatement e.g.:

Connection conn = DriverManager.getConnection("jdbc:postgresql://localhost:5432/", "postgres", "postgres");CallableStatement callableStatement = conn.prepareCall("{call f_raise_wage_employee_older_than(?,?)}");callableStatement.setInt(1, 20);callableStatement.setInt(2, 500);callableStatement.executeUpdate();

Or execute a native query with the EntityManager:

this.em.createNativeQuery("CALL p_raise_wage_employee_older_than(1, 20)");

I'll update this answer as soon as I get an answer from the pgJDBC maintainer.

UPDATE:

This topic is already discussed in the Postgres Mailing list (https://www.postgresql.org/message-id/4285.1537201440%40sss.pgh.pa.us) and there is currently no solution. The only way is to pass native SQL queries to the database or rewrite the STORED PROCEDURE as a FUNCTION


After PostgreSQL 11, PostgreSQL JDBC driver team has introduced a ENUM name EscapeSyntaxCallMode in PostgreSQL driver version 42.2.16. So this enum we can use while creating database connections or creating DataSource object. This Enum has 3 types of Values:

  1. "func" - set this when we always want to call functions.
  2. "call" - set this when we always want to call Procedures.
  3. "callIfNoReturn" - It checks for the return type in calling function/procedure, if return type exists PostgreSQL considers it as a function and calls it as a Function way. Otherwise it calls it as procedure way. So in my project I used this "callIfNoReturn", as I wanted PostgreSQL to auto detect whether I am calling function or procedure.

I already have given the answer in detail with the proper steps to follow:

Postgresql 11: Stored Procedure call error - To call a procedure, use CALL, Java