Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/heroku/2.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转换器以应用于阵列?_Java_Postgresql_Jooq_Pg Jdbc - Fatal编程技术网

Java 是否可以编写jOOQ转换器以应用于阵列?

Java 是否可以编写jOOQ转换器以应用于阵列?,java,postgresql,jooq,pg-jdbc,Java,Postgresql,Jooq,Pg Jdbc,我有一个postgres数据库,其中一些列的类型为varchar[]。jOOQ和pgjdbc ng合作得不好;jOOQ的DefaultBindContext有如下内容: protected final BindContext bindValue0(Object value, Field<?> field) throws SQLException { SQLDialect dialect = configuration.dialect(); // [#650] [#3

我有一个postgres数据库,其中一些列的类型为
varchar[]
。jOOQ和pgjdbc ng合作得不好;jOOQ的DefaultBindContext有如下内容:

protected final BindContext bindValue0(Object value, Field<?> field) throws SQLException {
    SQLDialect dialect = configuration.dialect();

    // [#650] [#3108] Use the Field's Converter before actually binding any value
    Converter<?, ?> converter = field.getConverter();
    Class<?> type = converter.fromType();
    value = ((Converter) converter).to(value);

    //...

    else if (type.isArray()) {
        switch (dialect) {
            case POSTGRES: {
                stmt.setString(nextIndex(), toPGArrayString((Object[]) value));
                break;
            }
它期望语句上的值为PGArray类型或实际数组类型;它无法将数组的字符串表示形式强制转换为数组的字符串表示形式:(

我正在尝试编写一个jOOQ转换器,它将在
String[]
PGArray
之间进行转换;理想情况下,这将意味着jOOQ的DefaultBindContext将充分保留转换后的值,然后pgjdbc ng将能够正确处理它

但是,我无法编写允许我这样做的jOOQ架构配置。我尝试了以下方面的变体:

<customType>    
    <customType>
        <name>StringArray</name>
        <type>java.lang.String[]</type>
        <converter>my.package.PGStringArrayConverter</converter>
    </customType>
</customTypes>

<forcedTypes>
    <forcedType>
        <name>StringArray</name>
        <types>varchar\[\]</types>
    </forcedType>
</forcedTypes>

字符串数组
java.lang.String[]
my.package.PGStringArrayConverter
字符串数组
varchar\[\]
没有任何运气;生成的表对象引用
String[][]
varchar[]
与任何内容都不匹配。即使我将其分解,使forcedType与任何类型匹配,但与仅与我的列匹配的
,并且转换器的类型为
java.lang.String
,我最终还是会遇到java编译器抱怨无法将Object[]强制转换为String[]


这条隧道的尽头有什么希望吗,或者我应该开始考虑迁移我的数据库吗?

所以,答案是,“有点。”

我在向后创建我的
PGStringArrayConverter
类;我创建了

public abstract class PGArrayConverter implements Converter<String[], PGArray>
我必须更改生成的表文件以删除createField数据类型的
.getArrayDataType()
调用:

public final org.jooq.TableField<my.package.gen.tables.records.TabularAnswerEntryRecord, java.lang.String[]> TEXT = createField("text", org.jooq.impl.DefaultDataType.getDefaultDataType("java.lang.String").getArrayDataType(), this, "", new my.package.PGStringArrayConverter());
public final org.jooq.TableField TEXT=createField(“TEXT”,org.jooq.impl.DefaultDataType.getDefaultDataType(“java.lang.String”).getArrayDataType(),this,”,new my.package.PGStringArrayConverter());
致:

public final org.jooq.TableField TEXT=createField(“TEXT”,org.jooq.impl.DefaultDataType.getDefaultDataType(“java.lang.String”),this,“,new my.package.PGStringArrayConverter());
整个解决方案让人感觉有点骇人,我将不得不编写一个庞大的单元测试,以确保在更新任何相关软件包时不会中断,但至少我能够读取和写入我的数据库

public abstract class PGArrayConverter implements Converter<Object, String[]> {
    @Override
    public String[] from(final Object databaseObject) {
        if (databaseObject == null) {
            return null;
        }
        if (databaseObject.getClass().isArray()) {
            return (String[]) databaseObject;
        }
        return (String[]) ((PGArray)databaseObject).getValue();
    }

    @Override
    public Object to(final String[] userObject) {
        if (userObject == null) {
            return null;
        }
        return new PGArray(null, null, userObject);
    }

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

    @Override
    public Class<String[]> toType() {
        return String[].class;
    }
}
<customType>
    <name>StringArray</name>
    <type>java.lang.String</type>
    <converter>my.package.PGStringArrayConverter</converter>
</customType>

<forcedType>
    <name>StringArray</name>
    <expression>.*tabular_answer_entry.text.*</expression>
    <types>.*</types>
</forcedType>
public final org.jooq.TableField<my.package.gen.tables.records.TabularAnswerEntryRecord, java.lang.String[]> TEXT = createField("text", org.jooq.impl.DefaultDataType.getDefaultDataType("java.lang.String").getArrayDataType(), this, "", new my.package.PGStringArrayConverter());
public final org.jooq.TableField<my.package.gen.tables.records.TabularAnswerEntryRecord, java.lang.String[]> TEXT = createField("text", org.jooq.impl.DefaultDataType.getDefaultDataType("java.lang.String"), this, "", new my.package.PGStringArrayConverter());