我有一个 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;
}
它将语句变量设置为"{\"value1\", \"value2\", \"etc\"}"
,这是您在查询中指定数组的方式。后来,pgjdbc-ng 有:
public static Object coerceToArray(Format format, Object val, Type type, Class<?> targetType, Map<String, Class<?>> typeMap, PGConnectionImpl connection) throws SQLException {
if (val == null) {
return null;
}
else if (val instanceof PGArray) {
return coerceToArray(format, ((PGArray) val).getValue(), type, targetType, typeMap, connection);
}
else if (val.getClass().isArray()) {
return coerceToArray(format, val, 0, Array.getLength(val), type, targetType, typeMap, connection);
}
throw createCoercionException(val.getClass(), targetType);
}
它期望语句中的值是 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>
没有任何运气;生成的表对象引用 a String[][]
,并且varchar[]
不匹配任何内容。即使我将其分解,以便强制类型匹配任何类型但<expression>
仅匹配我的列,并且转换器的类型java.lang.String
为.
这条隧道的尽头有没有光,还是我应该开始寻找迁移我的数据库?