【问题标题】:Stop jOOQ stripping characters from SQL field停止 jOOQ 从 SQL 字段中剥离字符
【发布时间】: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))));

上述函数渲染中变量sqlDSL.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


【解决方案1】:

原来它只去除'{}' 样式数组。替换将UUID[]转换为sql的代码

DSL.val(ids)

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[]) 防止它被剥离

【讨论】:

    猜你喜欢
    • 2018-04-20
    • 2010-09-19
    • 2012-09-30
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-06-18
    相关资源
    最近更新 更多