45

I am querying the information_schema.columns table in my PostgreSQL database. Using a table name, the result set finds all the column names, type, and whether it is nullable (except for the primary key, 'id'). This is the query being used:

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;

I have a string array for each of these results and I am trying to use the ResultSet method getArray(String columnLabel) to avoid looping through the results. I want to store the returned Arrays in the string arrays, but get a type mismatch error

Type mismatch: cannot convert from Array to String[]

Is there a way to convert or typecast the SQL Array object to a String[]?

Relevant Code:

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();
}

5 Answers 5

68

Use:

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

As explained here

Array is SQL type, getArray() returns an object to cast to java array.

Sign up to request clarification or add additional context in comments.

3 Comments

Thank you, I had tried using rs.getArray("is_nullable").getArray() but I don't think I had typecast it. This appears to have solved my problem.
For those who have tried this recently, the java.sql.Array.getArray() method now does nothing but throw an SQLFeatureNotImplemented exception, so we'll have to find another approach.
This solution won't work for some drivers, see stackoverflow.com/q/55181619/489856
4

Generalize the Array to Object

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

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

Use it loop as string:

type[i].toString();

3 Comments

This still causes an error. "Type mismatch: cannot convert from Array to Object[]". I think the major problem is that the ResultSet getArray method returns a java.sql Array, not the java.util.Arrays type under the java.lang Object class. Here is the javadoc on the method I'm using.
@Matt edited and verified, getArray() will return Array, and Array.getArray() returns java array.
Correct, this would now work, but it requires the unnecessary use of toString(). In a case where unknown or a variety of objects are contained in the ResultSet, generalizing to Object[] may be more useful. In my case, I only need Strings.
3

How to set an ArrayList property from an SQL Array:

Array a = rs.getArray("col"); // smallint[] column
if (a != null) {
    yourObject.setListProperty(Arrays.asList((Integer[]) a.getArray()));
}

2 Comments

What is this o in line 3?
o is an instance of an object with a property listProperty of type List<Integer>
0

this can be helpful

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);
                }

            }

        }

1 Comment

I up voted your solution, however please add some description to your answer.
-1

In Kotlin,

(resultSet.getArray(resultName)!!.array as Array<*>).toList()

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.