Hsqldb将ARRAY类型读取为Object [],而不是String []

时间:2019-03-15 11:29:03

标签: java hsqldb

我在内存中的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[]结尾(这是产品中使用的东西)。

  • HSQLDB:“ org.hsqldb:hsqldb:2.4.0”
  • Java:1.8.131

4 个答案:

答案 0 :(得分:1)

不回答!只是推荐!

您将始终面临HSQLDB(或H2)与实际数据库(MySQL,PostgreSQL)之间的兼容性问题。我使用https://www.testcontainers.org/modules/databases/。它很容易使用。只需更改连接URL和JDBC驱动程序即可。因此,testcontainer使用真正的DB启动容器以进行集成测试,并在测试后销毁它。

答案 1 :(得分:0)

使用从SQL类型到Java类的映射来查看getArray

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是否提供此支持,因为它不是开箱即用的。

答案 2 :(得分:0)

HSQLDB始终从resultSet.getArray(columnName).getArray()调用返回Object []。

  

是否有办法调整HSQLDB将列映射到Java类型的方式?一世   找不到它,为了我的生命。

当对象类型是字符类型时,您可以修改org.hsqldb.jdbc.JDBCArray的源以返回Sring []。

答案 3 :(得分:-1)

您可以

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