なぜそれが起こるのか
問題は、PostgreSQLがテキストデータ型と非テキストデータ型の間のキャストについて過度に厳密であるということです。暗黙のキャスト(CAST
のないキャスト)は許可されません または::
SQLの場合)text
のようなテキストタイプから またはvarchar
(character varying
)json
のようなテキストのような非テキストタイプに 、xml
、など。
PgJDBCドライバーは、varchar
のデータ型を指定します setString
を呼び出すとき パラメータを割り当てます。列のデータベースタイプ、関数の引数などが実際にはvarchar
ではない場合 またはtext
、しかし代わりに別のタイプでは、タイプエラーが発生します。これは、他の多くのドライバーやORMにも当てはまります。
PgJDBC:stringtype=unspecified
PgJDBCを使用する場合の最良のオプションは、通常、パラメーターstringtype=unspecified
を渡すことです。 。これは、setString
を渡すデフォルトの動作をオーバーライドします varchar
としての値 代わりに、データ型を「推測」するのはデータベースに任せます。ほとんどすべての場合、これは希望どおりに機能し、保存するタイプの入力バリデーターに文字列を渡します。
すべて:CREATE CAST ... WITH FUNCTION ...
代わりにCREATE CAST
を使用できます データ型固有のキャストを定義して、タイプごとにこれを許可しますが、これは他の場所で副作用を引き起こす可能性があります。これを行う場合は、しないを行ってください WITHOUT FUNCTION
を使用する キャストすると、型の検証がバイパスされ、エラーが発生します。データ型には入力/検証機能を使用する必要があります。 CREATE CAST
を使用する 文字列/テキストパラメータのタイプを指定するドライバを停止する方法がない他のデータベースドライバのユーザーに適しています。
例:
CREATE OR REPLACE FUNCTION json_intext(text) RETURNS json AS $$
SELECT json_in($1::cstring);
$$ LANGUAGE SQL IMMUTABLE;
CREATE CAST (text AS json)
WITH FUNCTION json_intext(text) AS IMPLICIT;
すべて:カスタムタイプハンドラー
ORMで許可されている場合は、データ型とその特定のORMのカスタム型ハンドラーを実装できます。これは、String
を使用するのではなく、PostgreSQLタイプに適切にマッピングされるネイティブJavaタイプを使用している場合に最も役立ちます。 、ただし、ORMでアノテーションなどを使用してタイプハンドラーを指定できる場合にも機能します。
カスタムタイプハンドラーを実装するためのメソッドは、ドライバー、言語、およびORMに固有です。 json
のJavaとHibernateの例を次に示します。 。
PgJDBC:PGObject
を使用したタイプハンドラー
JavaでネイティブJavaタイプを使用している場合は、PGObject
を拡張できます。 タイプにPgJDBCタイプマッピングを提供します。 PGObject
を使用するには、ORM固有のタイプハンドラーも実装する必要があります。 、ほとんどのORMはtoString
を呼び出すだけなので 彼らが認識しないタイプについて。これは、JavaとPostgreSQLの間で複雑なタイプをマッピングするための推奨される方法ですが、最も複雑な方法でもあります。
PgJDBC:setObject(int, Object)
を使用したタイプハンドラー
String
を使用している場合 より具体的なタイプではなく、Javaで値を保持するために、JDBCメソッドsetObject(integer, Object)
を呼び出すことができます。 特定のデータ型が指定されていない文字列を格納します。 JDBCドライバーは文字列表現を送信し、データベースは宛先列タイプまたは関数引数タイプからタイプを推測します。
関連項目
質問:
- postgreSQLJSON列をHibernate値型にマッピングする
- JPA(EclipseLink)カスタムタイプは可能ですか?
外部:
- http://www.postgresql.org/message-id/[email protected]
- https://github.com/pgjdbc/pgjdbc/issues/265
- http://www.pateldenish.com/2013/05/inserting-json-data-into-postgres-using-jdbc-driver.html