2016-07-19 4 views
0

私は、次のようなDBスキーマがあります。jarq(postgresql)を使用して、anyarrayパラメータ化ストアドファンクションをバッチ実行で処理する方法はありますか?

CREATE FUNCTION public.some_fun(anyarray) RETURNS anyarray AS $$ 
    SELECT $1; 
$$ LANGUAGE sql; 

CREATE TABLE some_table (some_col int[]); 

を、私はJavaで、次のコードを呼び出す:

DSLContext ctx = ... // retrieve DSLcontext 
Query query = ctx.insertInto(Tables.SOME_TABLE) 
    .values((Field) someFun(new Integer[]{1})); 
ctx.batch(query).execute(); 

コードが例外を生成します。

org.postgresql.util.PSQLException: ERROR: could not determine polymorphic type because input has type "unknown"

作成クエリであります:

insert into "public"."some_table" ("some_col") values ("public"."some_fun"('{"1"}'))

jooqは{1}配列を明示的に型キャストしていないことが判明し、postgresは配列型を推論できません。

興味深いことに、次のコードは、同じクエリを生成し、作業を行います。

Query query = ctx.insertInto(Tables.SOME_TABLE) 
    .values((Field) someFun(new Integer[]{1})); 
query.execute(); 

私は、この問題をどのようにJDBCハンドルバッチクエリに関連していると思いますjooqログ切り抜いたクエリがない限り、それが本当に実行されるものに。私は、次のコードを使用して問題のためのハックの回避策を見つけました:

Query query = ctx.insertInto(Tables.SOME_TABLE) 
    .values(
     (Field) someFun(
      DSL.field(DSL.array(new Integer[]{1}).toString() + "::int[]") 
     ) 
    ); 
ctx.batch(query).execute(); 

私もjooq作る常に明示的ALWAYSにキャストモードを設定することにより、キャストの値を入力しようとしているが、動作しないようです。

ctx.renderContext().castMode(RenderContext.CastMode.ALWAYS); 
Query query = ctx.insertInto(Tables.SOME_TABLE) 
    .values((Field) someFun(new Integer[]{1})); 
ctx.batch(query).execute(); 

私は実際には手動の醜い方法で型キャスティングを行う必要がありますか、これを処理するいくつかの良い方法がありますか?


UPDATE

次のように文字列をキャストタイプを生成することにより、鋳造はあまりイライラすることが可能である:

String.format("::%s[]", DefaultDataType.getDataType(SQLDialect.POSTGRES, Integer[].class).getCastTypeName()) 

それでも、それだけで回避策です。

答えて

0

j00Q 3.8以降、PostgreSQLのany,anyarrayなどの多型データ型はまだサポートされていません。保留中の機能リクエストがあります: https://github.com/jOOQ/jOOQ/issues/5479

あなたの回避策はおそらく現在の状態と同じです。

関連する問題