将SQL数组的结果集转换为字符串数组

44

我正在查询我的PostgreSQL数据库中的information_schema.columns表。使用表名,结果集会找到所有列名、类型以及是否可为空(除了主键'id')。这是正在使用的查询:

SELECT column_name, is_nullable,data_type FROM information_schema.columns
WHERE lower(table_name) = lower('TABLE1') AND column_name != 'id'
ORDER BY ordinal_position;

我有一个字符串数组用于保存这些结果,我试图使用 ResultSet 方法 getArray(String columnLabel) 来避免循环处理结果。我想将返回的数组存储在字符串数组中,但是出现了类型不匹配的错误。

Type mismatch: cannot convert from Array to String[]

有没有一种方法可以将SQL数组对象转换或强制类型转换为String[]?

相关代码:

String[] columnName, type, nullable;

//Get Field Names, Type, & Nullability 
String query = "SELECT column_name, is_nullable,data_type FROM information_schema.columns "
        + "WHERE lower(table_name) = lower('"+tableName+"') AND column_name != 'id' "
        + "ORDER BY ordinal_position";

try{
    ResultSet rs = Query.executeQueryWithRS(c, query);
    columnName = rs.getArray(rs.getArray("column_name"));
    type = rs.getArray("data_type");
    nullable = rs.getArray("is_nullable");
}catch (Exception e) {
    e.printStackTrace();
}
4个回答

65

使用:

Array a = rs.getArray("is_nullable");
String[] nullable = (String[])a.getArray();

此处所述Array是SQL类型,getArray()返回一个对象,可强制转换为Java数组。


1
谢谢,我曾尝试使用rs.getArray("is_nullable").getArray(),但我认为我没有进行类型转换。这似乎解决了我的问题。 - Matt
1
对于最近尝试过的人,java.sql.Array.getArray()方法现在什么也不会做,只会抛出一个SQLFeatureNotImplemented异常,因此我们必须寻找另一种方法。 - Cameron Hudson
这个解决方案对于一些驱动程序来说行不通,请参考https://stackoverflow.com/q/55181619/489856。 - Vincent

4

将数组泛化为对象

    Object[] type; //this is generic can use String[] directly
    Array rsArray;

    rsArray = rs.getArray("data_type");
    type = (Object [])rsArray.getArray();

将其作为字符串循环使用:

type[i].toString();

这仍然会导致错误。"_类型不匹配:无法从Array转换为Object[]"。我认为主要问题是ResultSet getArray方法返回的是java.sql Array,而不是java.lang Object类下的java.util.Arrays类型。这是我正在使用的方法的javadoc - Matt
@Matt已编辑并验证,getArray()将返回数组,而Array.getArray()返回Java数组。 - TheWhiteRabbit
正确,这样现在可以工作了,但它需要不必要地使用 toString()。在 ResultSet 中包含未知或各种对象的情况下,泛化为 Object[] 可能更有用。在我的情况下,我只需要字符串。 - Matt

3
如何从SQL数组设置ArrayList属性:
Array a = rs.getArray("col"); // smallint[] column
if (a != null) {
    yourObject.setListProperty(Arrays.asList((Integer[]) a.getArray()));
}

第三行的 o 是什么意思? - DerMike
1
o是一个具有类型为List<Integer>的属性listProperty的对象实例。 - yglodt

1
这可以很有帮助。
Object[] balance = (Object[]) ((Array) attributes[29]).getArray();
        for (Object bal : balance) {

            Object [] balObj =(Object[]) ((Array) bal).getArray();
            for(Object obj : balObj){
                Struct s= (Struct)obj;
                if(s != null ){
                    String [] str = (String[]) s.getAttributes();
                    System.out.println(str);
                }

            }

        }

2
我赞成你的解决方案,但请在你的回答中添加一些描述。 - BlooB

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接