2017-06-01 5 views
0

私は数の推定値を取得する機能を実現していますクエリに配列フィールド IN句配列フィールドを渡すまで問題ありません。これが起こると、jOOQはSQL内の配列中括弧を取り除きます。例えば上記の機能のレンダリングにおける変数sqlDSL.sql(sql)両方で停止jOOQストリッピング文字が

final UUID[] ids = new UUID[]{UUID.randomUUID()}; 
return db.select(countEstimate(db.select(TABLE.ID) 
    .from(TABLE) 
    .where(overlaps(ids, TABLE.FILTER_IDS)))); 

結果::

count_estimate(E'select "schema"."table"."id" 
from "schema"."table" 
where (
    ((\'{"75910f3b-83e6-41ed-bf57-085c225e0131"}\') && ("schema"."table"."filter_ids")) 
)') 

しかしfield(sql(sql), PostgresDataType.INT)がこれをレンダリング:

count_estimate(E'select "schema"."table"."id" 
from "schema"."table" 
where (
    ((\'"75910f3b-83e6-41ed-bf57-085c225e0131"\') && ("schema"."table"."filter_ids")) 
)') 

は、いずれかがあり、このJavaコードでそれを呼び出しますこれを回避してjOOQにクエリを残すように指示する方法はありますか?

(jOOQ 3.8.3、PG 9.5.5、PGドライバ9.4から1203-jdbc4)

+0

それが取り除かれるのを防ぎ? 'E '...''で始まるPostgreSQL特有の非標準エスケープシーケンスを使用しているようです。どうして? –

+0

... '{}'はJDBC(エスケープシーケンス)とjOOQ(テンプレート化)で意味を持つため、削除される可能性があります。文字列リテラルの中で意味を持つべきではありませんが、文字列リテラルに 'E '...' 'を追加すると、jOOQは現在その形式を認識しないかもしれません。 –

+0

こんにちはルーカス、 '{}'が取り除かれた理由を説明してくれてありがとう。 この場合、 'escape'は次のように実装されています: ' private static String escape(final String val){ return "E '" + val.replace( "\\"、 "\\\\") ( "'"、 "\\'")+ "'"; } ' PGの内容を無視して、PGが文字列を解釈した後、上記の変換が常に元のクエリに戻されるため、' $ 'の代わりに 'E' ... ''バージョンの引用符を使用しています。クエリの内部から '$$'(または '$ foo $'など)を安全にエスケープする方法は、まだ正しく実行される方法では見えません。 –

答えて

0

それが唯一'{}'スタイルアレイを取り除き判明。その中

DSL.array(Arrays.stream(ids) 
    .map(UUID::toString) 
    .collect(Collectors.toList()) 
    .toArray(new String[0])) 
    .cast(PostgresDataType.UUID.getArrayDataType() 

結果がcast(array[\'75910f3b-83e6-41ed-bf57-085c225e0131\'] as uuid[])をレンダリングして

DSL.val(ids) 

からSQLにUUID[]をオンコードを交換すると、どのように `)(`エスケープを実装しました

関連する問題