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:
- "
func
" - set this when we always want to call functions. - "
call
" - set this when we always want to call Procedures. - "
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