Могу ли я сравнить наборы результатов, как это? Я сталкиваюсь с ошибкой ниже - PullRequest
0 голосов
/ 04 мая 2018

У меня есть 2 ResultSets. 1-й ResultSet содержит записи из таблицы 1 из базы данных 1, а 2-й ResultSet содержит записи из таблицы 2 из базы данных 2. Мне нужен список записей из resultset1, которых нет в resultSet2. Для этого я написал эту логику, но она не работает и выдает мне следующую ошибку.

java.sql.SQLException: недопустимая операция для набора результатов только для чтения: deleteRow

if ( table1ResultSet != null )
  {
    while ( table1ResultSet.next() )
    {
      final String table1Record = table1ResultSet.getString( 1 );

      if ( table2ResultSet != null )
      {
        while ( table2ResultSet.next() )
        {
          final String table2Record = table2ResultSet.getString( 1 );

          if ( table1Record.toString().equalsIgnoreCase( table2Record.toString() ) )
          {
            table1ResultSet.deleteRow();

            break;
          }
        }
      }
    }


  }

  return table1ResultSet;

Ответы [ 2 ]

0 голосов
/ 04 мая 2018

Ваша логика:

  1. Предполагается, что записи располагаются в некотором порядке (что может или не может быть правдой, в зависимости от вашего SQL)
  2. Расходует весь набор результатов 2 для каждой строки набора результатов 1, что маловероятно для ваших намерений
  3. Удаляет вещи, что тоже не то, что вы упомянули в вопросе

Ваш вопрос может быть легко реализован так:

Set<String> list1 = new HashSet<>();
while (table1ResultSet.next())
    list1.add(table1ResultSet.getString(1).toLowerCase());

while (table2ResultSet.next())
    list1.remove(table2ResultSet.getString(1).toLowerCase());

System.out.println(list1);

При этом будут напечатаны все значения (без дубликатов), которые присутствуют в первом наборе результатов, но отсутствуют во втором.

0 голосов
/ 04 мая 2018

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

Когда вы готовили заявление, вы делали его с ResultSet.CONCUR_UPDATABLE?

Запрос может выбирать только из одной таблицы без каких-либо операций объединения. В запросе должны быть выбраны все необнуляемые столбцы и все столбцы, которые не имеют значения по умолчанию. Запрос не может использовать «SELECT *». Невозможно выбрать производные столбцы или агрегаты, такие как SUM или MAX из набора столбцов.

Возможно, вы захотите переместить наборы результатов в наборы Java, прежде чем работать, делая то, что вы делаете, хотя, так как использование deleteRow фактически удалит строку из базы данных (если это не ожидаемый результат)

Есть еще одна проблема с вашим кодом. Даже если удаление сработает, ваш код завершится ошибкой на второй итерации набора результатов 1, поскольку вы никогда не сбрасываете table2ResultSet, и для второй итерации в table2resulset не будет больше результатов.

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

select * from table 1 where id not in select id from table 2

или

delete from table 1 where id not in select id from table 2

если это цель

...