Hsqldb читает тип ARRAY как Object [], а не String [] - PullRequest
0 голосов
/ 15 марта 2019

У меня есть таблица в базе данных HSQLDB в памяти для тестирования интеграции, со столбцом ARRAY (categories VARCHAR(256) ARRAY NOT NULL), обратите внимание, что она определена как массив VARCHAR.

Есть ли способ настроить способ, с помощью которого HSQLDB отображает столбцы в типы Java? Я не могу найти его ради своей жизни.

Когда столбец массива читается (с помощью org.hsqldb.jdbc.JDBCDriver), resultSet.getArray(columnName).getArray() возвращает Object[], а не String[].

Это приводит к исключению приведения, поскольку вызывающий код (который я не контролирую) ожидает String[]. resultSet.getArray(columnName) возвращает org.hsqldb.jdbc.JDBCArray, и в идеале я хотел бы, чтобы он возвращал PostgreSQLTextArray, чтобы я мог получить String[] (это то, что используется в prod).

  • HSQLDB: "org.hsqldb: hsqldb: 2.4.0"
  • Java: 1.8.131

Ответы [ 4 ]

1 голос
/ 15 марта 2019

Не отвечай! Просто рекомендация!

Вы всегда будете сталкиваться с проблемами совместимости между HSQLDB (или H2) и реальной БД (MySQL, PostgreSQL). Я использую https://www.testcontainers.org/modules/databases/. Это легко использовать. Необходимо просто изменить URL-адрес подключения и драйвер JDBC. Итак, testcontainer запускает контейнер с реальной БД для интеграционных тестов и уничтожает его после тестов.

0 голосов
/ 15 марта 2019

HSQLDB всегда возвращает Object [] из вызова resultSet.getArray(columnName).getArray().

Есть ли способ настроить способ, с помощью которого HSQLDB отображает столбцы в типы Java? я не могу найти его, ради моей жизни.

Вы можете изменить источник org.hsqldb.jdbc.JDBCArray, чтобы он возвращал Sring [], когда тип объекта является символьным типом.

0 голосов
/ 15 марта 2019

Посмотрите на getArray с отображением типа SQL в класс Java.

String[] getStringArray(ResultSet rs, int column) {
    Array array = rs.getArray(column);

    String sqlType = rs.getMetaData().getColumnTypeName(column);
    logger.info("SQL type: " + sqlType); // VARCHAR ARRAY?

    Map<String, Class<?>> columnTypes = new TreeMap<>();
    columnTypes.put("VARCHAR", String.class);
    columnTypes.put(sqlType, String.class);

    Object a = array.get(columnTypes);
    if (a instanceOf String[]) {
        logger.info("Probably VARCHAR worked");
        return (String[])a;
    }
    logger.info("The above did not help, use only the following.");
    return Stream.of((Object[] a).map(String.class::cast).toArray();
}

Не ясно, предоставляет ли HSQLDB такую ​​поддержку, поскольку она не была встроена.

0 голосов
/ 15 марта 2019

Вы можете сделать

String[] values = new ArrayList();
while (rs.next()) {
values.add(rs.getString("column_name");
}
return values.toArray(new String[list.size()]);
...