Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/377.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何使用jOOQ处理自定义SGBD类型_Java_Sql_Postgresql_Jooq - Fatal编程技术网

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

Java 如何使用jOOQ处理自定义SGBD类型,java,sql,postgresql,jooq,Java,Sql,Postgresql,Jooq,我想知道如何利用PostgresSQL最新版本中的功能 我可以找到关于如何使用自定义Java类型管理普通列的文档,但是我找不到如何将自定义类型列用于自定义Java类型。jOOQ中是否有文档或现有代码,我可以查看并尝试贡献?从jOOQ 3.6开始,没有明确支持这些范围类型。现在路线图上有一个功能请求() 自定义转换器: 但是,您可以使用实现支持自己。您基本上需要的是这样一个转换器: public class Int4RangeConverter implements Converter<Ob

我想知道如何利用PostgresSQL最新版本中的功能


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

从jOOQ 3.6开始,没有明确支持这些
范围
类型。现在路线图上有一个功能请求()

自定义转换器: 但是,您可以使用实现支持自己。您基本上需要的是这样一个
转换器

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;
    }
}
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");
    }

    // ...
}
。理想情况下,您将对生成的代码应用此绑定

使用
范围
在SQL中键入: 使用它很简单。插入:

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()
的定义:

私有静态条件范围重叠(
字段f1,范围f2){
返回DSL.condition(“range_重叠({0},{1})”,f1,val(f2,f1.getDataType());
}

如何在Java中注册绑定(在本例中为Int4RangeConverter)?本手册仅说明如何使用xml。@singularity:有一节解释编程配置。
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()));
}