Как получить все оставшиеся строки из пакета ResultSet Java SQL - PullRequest
0 голосов
/ 30 апреля 2018

Раньше я использовал com.datastax.driver.core.ResultSet. Я мог бы взять все оставшиеся строки и поместить его в массив моего модельного класса, а затем добавить его в список массивов.

Ниже приведен мой предыдущий код с ResultSet из пакета datastax.

List<ReportDescription[]> result = new ArrayList<>();
ReportDescription[] csvReportDescriptions;
csvReportDescriptions = resultSet.all().stream()
                    .map(row -> new ReportDescription(row.getObject("value"))).toArray(ReportDescription[]::new);
result.add(csvReportDescriptions);

В настоящее время я меняю базу данных, поэтому теперь мне нужно переключить ResultSet в пакет java.sql.ResultSet. Есть ли возможность получить все строки, создать новый экземпляр моих моделей и поместить его в список массивов, как я это делал раньше?

Я делаю это по своему усмотрению

try {
ResultSet rS = dataSource.getConnection().createStatement().executeQuery(query.toString());
    while(rS.next()){
        descriptions.add(new ReportDescription(rS.getObject("VALUE")));
    }
    } catch (SQLException e) {
                dataSource.logError("Can't execute statement :" + query.toString());
    }               

    csvReportDescriptions = descriptions.toArray(new ReportDescription[descriptions.size()]);
    result.add(csvReportDescriptions);

Ответы [ 2 ]

0 голосов
/ 30 апреля 2018

Вы пытаетесь извлечь данные из ResultSet способом Java8, используя Streams, поэтому есть несколько способов сделать это.

Как мы пишем SQL в Java 7 , используя JDBC

List<Schema> result = new ArrayList<>();
try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    try (PreparedStatement stmt = c.prepareStatement(sql);
         ResultSet rs = stmt.executeQuery()) {

        while (rs.next()) {
            System.out.println(
                new Schema(rs.getString("SCHEMA_NAME"),
                           rs.getBoolean("IS_DEFAULT"))
            );
        }
    }
}

Как мы пишем SQL в Java 8 , используя jOOλ

try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    try (PreparedStatement stmt = c.prepareStatement(sql) {

        // We can wrap a Statement or a ResultSet in a
        // Java 8 ResultSet Stream
        SQL.stream(stmt, Unchecked.function(rs ->
            new Schema(
                rs.getString("SCHEMA_NAME"),
                rs.getBoolean("IS_DEFAULT")
            )
        ))
        .forEach(System.out::println);
    }
}

Как мы пишем SQL в Java 8 , используя jOOQ

try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    DSL.using(c)
       .fetch(sql)

       // We can use lambda expressions to map jOOQ Records
       .map(rs -> new Schema(
           rs.getValue("SCHEMA_NAME", String.class),
           rs.getValue("IS_DEFAULT", boolean.class)
       ))

       // ... and then profit from the new Collection methods
       .forEach(System.out::println);
}

Как мы пишем SQL в Java 8 , используя Spring JDBC

try (Connection c = getConnection()) {
    String sql = "select schema_name, is_default " +
                 "from information_schema.schemata " +
                 "order by schema_name";

    new JdbcTemplate(
            new SingleConnectionDataSource(c, true))

        // We can use lambda expressions as RowMappers
        .query(sql, (rs, rowNum) ->
            new Schema(
                rs.getString("SCHEMA_NAME"),
                rs.getBoolean("IS_DEFAULT")
            ))

        // ... and then profit from the new Collection methods
        .forEach(System.out::println);
}

Источник: JOOQ

0 голосов
/ 30 апреля 2018

Краткий ответ: вы не можете. Это связано с тем, что ResultSet изначально был создан с поддержкой баз данных, в которых есть поддержка курсоров - все ваши результаты могут даже не находиться в памяти сервера баз данных, и при этом фактически невозможно загрузить их все.

Что вы можете сделать, это просто просмотреть набор результатов, добавив все результаты в список с помощью некоторого стандартного кода:

List<ReportDescription> descs = new ArrayList<>();
while (resultSet.next()) {
    descs.add(new ReportDescription(resultSet.getObject("value")));
}

РЕДАКТИРОВАТЬ: Чтобы расширить ответ - ResultSet на самом деле всегда держит курсор на строке (или специальной квази-строке: перед первым или после последнего ). Следовательно, любые методы получения, которые вы вызываете для ResultSet, фактически выбирают соответствующие данные из строки, на которую указывает курсор (или выдают исключение, если его нет ни в одной строке).

...