Hibernateを使ったPostgreSQLの11ストアドプロシージャを呼び出すことはできません

rieckpil:

PostgreSQLの11は現在、ストアドプロシージャをサポートし、私は1を呼び出すようにしようとしています休止状態5.3.7.FinalPostgresqlの42.2.5 JDBCドライバPostgreSQLの11の前の私たちはJPAので呼び出すことができた機能を持っていました@NamedStoredProcedureしかし、機能がで実行されたSELECT my_func();と新しいストアドプロシージャを用いて実行されなければなりませんCALL my_procedure();

私は、次のような単純なストアドプロシージャを実行しようとしています:

CREATE OR REPLACE PROCEDURE p_raise_wage_employee_older_than(operating_years 
int, raise int)
AS $$
    BEGIN
       UPDATE employees
       SET wage = wage + raise 
       WHERE EXTRACT(year FROM age(entrance_date)) >= operating_years;
    END $$
LANGUAGE plpgsql;

次のようなJPA注釈ルックス:

@NamedStoredProcedureQuery(name = "raiseWage", 
   procedureName = "p_raise_wage_employee_older_than", 
   parameters = {
        @StoredProcedureParameter(name = "operating_years", type = Integer.class, 
           mode = ParameterMode.IN),
        @StoredProcedureParameter(name = "raise", type = Integer.class, 
            mode = ParameterMode.IN)
})

そして、私は、ストアドプロシージャを呼び出しています:

StoredProcedureQuery storedProcedureQuery = this.em.createNamedStoredProcedureQuery("raiseWage"); 
storedProcedureQuery.setParameter("operating_years", 20);
storedProcedureQuery.setParameter("raise", 1000);
storedProcedureQuery.execute();

私のログは、次のようになります。

Hibernate: {call p_raise_wage_employee_older_than(?,?)}
2019-02-17 11:07:41.290  WARN 11168 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : SQL Error: 0, SQLState: 42809
2019-02-17 11:07:41.291 ERROR 11168 --- [           main] o.h.engine.jdbc.spi.SqlExceptionHelper   : ERROR: p_raise_wage_employee_older_than(integer, integer) is a procedure
  Hinweis: To call a procedure, use CALL.
  Position: 15

最初のHibernateのログは、Hibernateが使用することを示しているcallストアドプロシージャを実行するが、私は、SQL例外取得していますCALL使用されていませんが。これは、あなたがモデル化することができましたPostgresqlの11に以前のようにPostgreSQLの方言のバグですFUNCTIONSので、JPA内のストアドプロシージャのようにSELECT使用していませんでしたかCALL

rieckpil:

pgJDBC 42.2.5は、PostgreSQLの11リリース(10月、2018年)の前に(2018年8月)にリリースされたとして、私は、これは現在のPostgreSQL自体のJDBCドライバ内の問題だと思います。私が作成した問題を GitHubのリポジトリ内。

この問題を回避するためには、書き換え可能性STORED PROCEDUREとしてFUNCTION、使い@NamedStoredProcedureQueryJDBCと直接相互作用するか、またはCallableStatement例えば:

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();

またはでネイティブクエリを実行EntityManager

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

私はpgJDBCメンテナから答えを得るように私はすぐにこの答えを更新します。

更新:

このトピックは、すでにPostgresのメーリングリスト(で議論されhttps://www.postgresql.org/message-id/4285.1537201440%40sss.pgh.pa.us)と何の解決策は現在ありません。唯一の方法は、データベースへのネイティブSQLクエリを渡すか、書き換えることであるSTORED PROCEDUREようにFUNCTION

おすすめ

転載: http://43.154.161.224:23101/article/api/json?id=192686&siteId=1