【问题标题】:Hsqldb reads ARRAY type as Object[], not String[]hsqldb 将 ARRAY 类型读取为 Object[],而不是 String[]
【发布时间】:2019-03-15 11:29:02
【问题描述】:

我在内存 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

【问题讨论】:

  • 你能检查 .getArray() 返回的实际类型吗?使用getArray()[0].getClass().getName()。

标签: java hsqldb


【解决方案1】:

不回答!只是推荐!

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

【讨论】:

  • 谢谢!也许我们应该。但是所有开发人员都必须在他们想要运行这些测试的地方安装 Docker,对吗?
  • 是的,反正docker是主流))
【解决方案2】:

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

【讨论】:

  • 可以工作,但我无法控制 ResultSet 的使用方式。
  • H2 在能够以多个数据库供应商的方言运行方面做了很多工作。对不起。
【解决方案3】:

HSQLDB 总是从 resultSet.getArray(columnName).getArray() 调用返回一个 Object[]。

有没有办法调整 HSQLDB 将列映射到 Java 类型的方式?一世 一辈子都找不到。

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

【讨论】:

    【解决方案4】:

    你可以的

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

    【讨论】:

    • getString() 返回一个字符串而不是一个数组
    • while 循环遍历数组
    • while 循环遍历 ResultSet 中的行,而不是遍历列的数组元素。
    猜你喜欢
    • 2017-08-10
    • 2017-01-29
    • 1970-01-01
    • 1970-01-01
    • 2021-07-10
    • 2022-07-22
    • 2012-06-27
    • 2010-10-26
    • 2014-07-20
    相关资源
    最近更新 更多