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