我正在使用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模板