gpt4 book ai didi

java - 如何使用 jOOQ 处理自定义 SGBD 类型

转载 作者:行者123 更新时间:2023-11-29 12:13:04 25 4
gpt4 key购买 nike

我想知道如何利用 new range types您可以在最新版本的 PostgresSQL 中找到。

我可以找到 jOOQ有关如何使用自定义 Java 类型管理普通列的文档,但是我找不到如何将自定义类型列用于自定义 Java 类型。 jOOQ 中是否有文档或一段现有代码我可以查看并尝试做出贡献?

最佳答案

jOOQ 3.17 范围类型支持

范围类型支持已添加到 jOOQ 3.17.0,请参阅 #2968 .为此,jooq-postgres-extensions 模块需要出现在代码生成器和运行时的类路径中,以提供适当的绑定(bind)和数组绑定(bind)。

旧 jOOQ 版本的历史答案:

自定义转换器:

但是,您可以使用 jOOQ 3.5 custom data type Binding 自行实现支持.您本质上需要的是一个像这样的 Converter:

public class Int4RangeConverter implements Converter<Object, Range<Integer>> {
private static final Pattern PATTERN = Pattern.compile("\\[(.*?),(.*?)\\)");

@Override
public Range<Integer> from(Object t) {
if (t == null)
return null;

Matcher m = PATTERN.matcher("" + t);
if (m.find())
return Tuple.range(
Integer.valueOf(m.group(1)),
Integer.valueOf(m.group(2)));

throw new IllegalArgumentException("Unsupported range : " + t);
}

@Override
public Object to(Range<Integer> u) {
return u == null ? null : "[" + u.v1 + "," + u.v2 + ")";
}

@Override
public Class<Object> fromType() {
return Object.class;
}

@SuppressWarnings({ "unchecked", "rawtypes" })
@Override
public Class<Range<Integer>> toType() {
return (Class) Range.class;
}
}

上面的转换器使用jOOLorg.jooq.lambda.tuple.Range类型,但您可以自己实现,或者如果您愿意,也可以只使用 int[]

自定义绑定(bind)

Converter 现在可以像这样在 Binding 中使用:

public class PostgresInt4RangeBinding implements Binding<Object, Range<Integer>> {

@Override
public Converter<Object, Range<Integer>> converter() {
return new Int4RangeConverter();
}

@Override
public void sql(BindingSQLContext<Range<Integer>> ctx) throws SQLException {
ctx.render()
.visit(DSL.val(ctx.convert(converter()).value()))
.sql("::int4range");
}

// ...
}

More information about how to use custom data type bindings can be found in the manual .理想情况下,您会将此绑定(bind)应用于生成的代码。

在 SQL 中使用 Range 类型:

使用起来很简单。插入:

DSL.using(configuration)
.insertInto(T_EXOTIC_TYPES)
.columns(T_EXOTIC_TYPES.ID, T_EXOTIC_TYPES.RANGE_INT4)
.values(1, range(1, 5))
.execute();

选择:

assertEquals(range(1, 5), DSL.using(configuration).fetchValue(
select(T_EXOTIC_TYPES.RANGE_INT4)
.from(T_EXOTIC_TYPES)
.where(rangeOverlaps(T_EXOTIC_TYPES.RANGE_INT4, range(0, 2))))
);

使用 rangeOverlaps() 的以下定义:

private 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()));
}

关于java - 如何使用 jOOQ 处理自定义 SGBD 类型,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/21238441/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com