我正在实现一个函数来估计计数,如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 driver 9.4-1203-jdbc4)
答案 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[])
阻止它被剥离