停止jOOQ从SQL字段中剥离字符

时间:2017-06-01 04:59:42

标签: postgresql jooq

我正在实现一个函数来估计计数,如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 driver 9.4-1203-jdbc4)

1 个答案:

答案 0 :(得分:0)

事实证明它只剥离'{}'样式数组。替换将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[])阻止它被剥离