У меня есть база данных postgres с некоторыми столбцами, которые имеют тип varchar[]
. jOOQ и pgjdbc-ng не играют хорошо; DefaultBindContext jOOQ имеет что-то вдоль линий:Можно ли написать jOOQ Converter для применения к массиву?
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-нг имеет:
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 или фактического массива; он не может принудить представление String массива к представлению String массива. :(
Я пытаюсь написать jOOQ конвертер, который будет конвертировать между String[]
и PGArray
, в идеале, это будет означать, что DefaultBindContext jOOQ был бы оставить преобразованное значение в одиночку достаточно хорошо, а затем pgjdbc-нг будет в состоянии справиться с этим .. правильно
Однако я не смог написать конфигурацию схемы 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
. Я получаю компилятор java, жалующийся на то, что не смог выполнить Object [] в String [].
Есть ли какой-либо свет в конце этого туннеля, или я должен начать искать миграцию моей базы данных?