2017-06-01 70 views
0

我實現一個函數來獲取計數的估計爲PostgreSQL文檔這裏https://wiki.postgresql.org/wiki/Count_estimate停止jOOQ剝離從SQL域字符

我使用的功能描述:

public static Field<Integer> countEstimate(final QueryPart query) { 
    final String sql = String.format("count_estimate(%s)", escape(query.toString())); 
    return field(sql(sql), PostgresDataType.INT); 
} 

它看起來直到我在查詢中傳遞 IN子句數組字段。發生這種情況時,jOOQ從我的SQL中剝離數組花括號。例如這種java代碼調用它:

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

結果在這兩個變量sql和上述功能渲染DSL.sql(sql)

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")) 
)') 

有什麼方法來解決這個問題,並告訴jOOQ離開我的查詢單獨?

(jOOQ 3.8.3,9.5.5 PG,PG驅動9.4-1203-jdbc4)

+0

你是如何實現'越獄()'?看起來你正在使用PostgreSQL特定的非標準轉義序列,以'E'...'開頭。爲什麼? –

+0

...注意'{}'可能會被剝離,因爲它們在JDBC(轉義序列)和jOOQ(模板)中具有含義。它們不應該在字符串文字中有含義,但是如果你在字符串文字前面加上'E'...'',jOOQ目前可能無法識別它的格式。 –

+0

嗨盧卡斯,謝謝你解釋爲什麼'{}'被剝奪。 在這種情況下'escape'被實現爲: 'private static String escape(final String val){ return「E'」+ val.replace(「\\」,「\\\\」)。replace (「'」,「\\'」)+「'」; }' 我使用'E'...''版本的引用而不是'$$',因爲上面的轉換應該總是在PG解釋字符串後映射回原始查詢,無論該查詢,但我看不出如何安全地從查詢中以一種比仍然正確執行的方式逃避'$$'(或'$ 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[])轉動UUID[]到SQL從

DSL.val(ids) 

代碼防止其被剝奪