在 JOOQ Postgres 范围类型上使用"lower"和"upper"聚合函数



我正在使用Postgresnumrange类型和此处定义的JOOQ,并希望在所选范围上调用lower/upper聚合函数。我的理解是,这些功能实际上并没有在jooq-postgres-extensions模块中实现,我必须自己实现。通过阅读这篇博客文章,作者提到这些功能必须自己实现,他给出了一些例子:

static <T extends Comparable<T>> Condition 
rangeContainsElem(Field<Range<T>> f1, T e) {
return DSL.condition("range_contains_elem({0}, {1})", f1, val(e));
}

static <T extends Comparable<T>> Condition 
rangeOverlaps(Field<Range<T>> f1, Range<T> f2) {
return DSL.condition("range_overlaps({0}, {1})", f1, val(f2, f1.getDataType()));
}

然而,他没有显示lower/upper函数的任何实现。这些功能是如何实现的?

理想情况下,最终目标是能够做这样的事情,检索一列范围的下限和上限:

val rangeMetadata = create.select(
BigDecimalRange(
max(upper(RANGE_PARAMETER.VALUE)),
true,
min(lower(RANGE_PARAMETER.VALUE)),
true
)
)
.from(RANGE_PARAMETER)
.fetch()

定义rangeOverlaps()lower()upper()聚合函数没有太大区别,可以完全用同样的方法。为了将该数据直接映射到BigDecimalRange类型,您可以使用:

  • 嵌套记录
  • 临时转换
create.select(
row(
max(upper(RANGE_PARAMETER.VALUE)),
min(lower(RANGE_PARAMETER.VALUE))
).mapping { u, l -> bigDecimalRange(u, true, l, true) }
)
.from(RANGE_PARAMETER)
.fetch()

关于的注意事项

我的理解是,这些功能实际上并没有在jooq-postgres扩展模块中实现,我必须以某种方式自己实现

没有什么大的理由不应该这样做。这只是一项尚未实现的任务。我为此制造了一个问题。可能有助于支持开箱即用:#13828

如何创建纯SQL模板Field<T>

显然,从普通的SQL模板Condition(您已经有了(到Field<T>似乎有困难,但这是一样的:

public static Field<BigDecimal> upper(Field<? extends BigDecimalRange> f) {
return DSL.field("upper({0})", SQLDataType.NUMERIC, f);
}

另请参阅:

  • 纯SQL
  • 纯SQL模板

最新更新