PostgreSQL 11の後、PostgreSQLJDBCドライバーチームはENUM名を導入しました EscapeSyntaxCallMode PostgreSQLドライバーバージョン42.2.16。この列挙型は、データベース接続またはDataSource
の作成時に使用できます。 物体。この列挙型には、次の3種類の値があります。
- "
func
"-常に関数を呼び出したいときにこれを設定します。 - "
call
"-常にプロシージャを呼び出したいときにこれを設定します。 - "
callIfNoReturn
"-関数/プロシージャを呼び出すときにリターンタイプをチェックします。リターンタイプが存在する場合、PostgreSQLはそれを関数と見なし、関数ウェイとして呼び出します。それ以外の場合は、プロシージャウェイとして呼び出します。したがって、私のプロジェクトではこれを使用しました"callIfNoReturn
"、関数を呼び出しているのかプロシージャを呼び出しているのかをPostgreSQLに自動検出させたかったので。
したがって、この問題を修正するには、以下の手順に従うだけで済みます。
-
pom.xml
で、PostgreSQLJDBCドライバーのバージョンを古いバージョンから42.2.16以降にアップグレードします。 またはgradle。<dependency> <groupId>org.postgresql</groupId> <artifactId>postgresql</artifactId> <version>42.2.16</version> </dependency>
-
もちろん、プロシージャを作成するには、マシンにPostgreSQLServerバージョン>=11がインストールされている必要があります。
-
Springを使用している場合は、データソースオブジェクトの作成中に、
escapeSyntaxCallMode
を追加する必要があります。"jdbcUrl"
のクエリ文字列として このように:<bean id="dataSource" parent="com.zaxxer.hikari.HikariDataSource"> <property name="jdbcUrl" value="jdbc:postgresql://localhost:5432/dev_db?escapeSyntaxCallMode=${cibase.db.app.procedureCallPolicy}"/> <property name="username" value="${cibase.db.app.user}"/> <property name="password" value="${cibase.db.app.password}"/> </bean>
?escapeSyntaxCallMode=${cibase.db.app.procedureCallPolicy}
:ここでは、プロパティファイルから列挙値を選択しましたが、"func"/"call"/"callIfNoReturn"
の中から任意の列挙値を直接入力できます。 要件に応じて。
これでコードを実行すると、正しく機能します。
注: Spring Data JpaでプレーンJDBCコードを使用している場合でも、@ Procedureを使用している場合でも、プロシージャ呼び出しの方法を変更する必要はありません。
詳細については、このリンクをたどってください https://github.com/pgjdbc/pgjdbc