2016-09-16 4 views
0

Это Java 8, Oracle JVM для Windows/Linux и с использованием последнего JDBC Java 8-совместимого драйвера для MS-SQL (если это имеет значение).Java JDBC rowset to tocollection() использует метод

Я хочу, чтобы преобразовать данные/литое/перемещения из JDBC RowSet таких как CachedRowSet с использованием метода toCollection() в Collection полных строках. Это позволило бы мне использовать stream() и лямбда для обработки набора строк в моей программе Java.

Единственный столбец toCollection("colname") метод подходит для меня.

Я хотел бы знать, как конвертировать из строки JDBC в коллекцию, содержащую все столбцы набора строк. Я искал примеры, но не нашел, любые указатели на это будут высоко оценены.

+0

Это именно то, что 'toCollection()' уже делает. Неясно, что вы спрашиваете. – EJP

+0

Я хотел увидеть пример использования метода toCollection() для преобразования CachedRowSet в коллекцию. Не для одного столбца, а для всей строки, всех столбцов строки. Таким образом, вывод представляет собой сборку строк, в которой каждая строка содержит все столбцы по отдельности. –

+0

Вот что он делает. Прочтите Джавадока. Если вы запрашиваете ресурс вне сайта, вы здесь не по теме, но, конечно, есть пример в учебнике JDBC для Oracle? И, конечно же, вы сделали какую-то свою попытку, мы можем прокомментировать? – EJP

ответ

-1

Пожалуйста, обратите внимание на следующий фрагмент:

ResultSetMetaData rsmd = rs.getMetaData(); 
HashMap<String,Object> map; 
while(rs.next()){ 
    int numColumns = rsmd.getColumnCount(); 
    map = new HashMap<String,Object>(); 
    for (int i=1; i<=numColumns; i++) { 
     String colName = rsmd.getColumnName(i); 
     if(rsmd.getColumnType(i)==java.sql.Types.ARRAY){ 
      map.put(colName, rs.getArray(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.BIGINT){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.BOOLEAN){ 
      map.put(colName, rs.getBoolean(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.BLOB){ 
      map.put(colName, rs.getBlob(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.DOUBLE){ 
      map.put(colName, rs.getDouble(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.FLOAT){ 
      map.put(colName, rs.getFloat(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.INTEGER){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.NVARCHAR){ 
      map.put(colName, rs.getNString(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.VARCHAR){ 
      map.put(colName, rs.getString(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.TINYINT){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.SMALLINT){ 
      map.put(colName, rs.getInt(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.DATE){ 
      map.put(colName, rs.getDate(colName)); 
     } 
     else if(rsmd.getColumnType(i)==java.sql.Types.TIMESTAMP){ 
      map.put(colName, rs.getTimestamp(colName)); 
     } 
     else{ 
      map.put(colName, rs.getObject(colName)); 
     } 
    } 
    //do something with the map here.. 
} 
+1

это не отвечает на мой вопрос.Я хочу знать, как использовать метод toCollection() для CachedRowSet, чтобы скопировать все строки, все столбцы набора строк в коллекцию, содержащую все строки и все столбцы. –

2

Как уже упоминалось выше, вы должны использовать toCollection() метод, но возвращает коллекцию com.sun.rowset.internal.Row, которая должна быть преобразована для работы с потоковыми API. См. Пример:

ResultSetMetaData md = rowset.getMetaData(); 
List<Map<String, Object>> res = new ArrayList<>(); 
Collection<Row> c = (Collection<Row>) rowset.toCollection(); 
for(Row row: c) { 
    Map<String, Object> m = new HashMap<String, Object>(); 
    for (int i = 1; i <= md.getColumnCount(); i++) { 
     m.put(md.getColumnName(i), row.getColumnObject(i)); 
    } 
    res.add(m); 
} 
res.stream().forEach(m -> System.out.println(m)); 
+0

спасибо, но я получаю ограничение доступа, пытаясь получить доступ к классу Row из com.sun.rowset.internal.Row; –

+0

плюс он определяется как внутренний, поэтому я не уверен, поддерживает ли он этот класс? –

+0

Я думаю, что его детали реализации драйвера JDBC, который вы используете. С jtds (net.sourceforge.jtds.jdbc.Driver) последней версии он отлично работает. – mv200580

0

Это может помочь кому-то еще, я не знаю. Получается, что мой код был на самом деле ОК. Мне пришлось изменить настройку IDE Eclipse, чтобы изменить сообщения с ограниченным доступом по умолчанию от Error to Warning. Это изменение позволило мне использовать Java Collection of Row (внутренний класс Sun, импортированный) и преобразовать набор строк JDBC в коллекцию Java, подходящую для использования в потоках Java 8. Я не знаю, поддерживается ли эта практика или если она даже хорошая практика использовать внутренний класс Row Sun через импорт com.sun.rowset.internal. *; но код действительно работает правильно.

Смежные вопросы