【发布时间】:2017-06-01 13:33:04
【问题描述】:
我正在实现一个函数来估计计数,如 PostgreSQL 文档中所述,https://wiki.postgresql.org/wiki/Count_estimate
我正在使用函数:
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,PG 9.5.5,PG 驱动程序 9.4-1203-jdbc4)
【问题讨论】:
-
你是如何实现
escape()的?看起来您正在使用以E'...'开头的特定于 PostgreSQL 的非标准转义序列。为什么? -
... 请注意
{}可能会被剥离,因为它们在 JDBC(转义序列)和 jOOQ(模板)中有意义。它们不应该在字符串文字中具有含义,但是如果您在字符串文字前面加上E'...',jOOQ 目前可能无法识别其格式。 -
嗨 Lukas,感谢您解释为什么
{}被剥夺。在这种情况下,escape实现为:private static String escape(final String val) { return "E'" + val.replace("\\", "\\\\").replace("'", "\\'") + "'"; }我使用的是E'...'版本的引用而不是$$,因为在 PG 解释字符串之后,上面的转换应该总是映射回原始查询,无论查询的内容,而我看不到如何以仍能正确执行的方式从查询内部安全地转义$$(或$foo$等)。
标签: postgresql jooq