我可以比较像这样的结果集吗?我面临以下错误

时间:2018-05-04 07:00:03

标签: java loops jdbc resultset

我有2个ResultSet。第一个ResultSet包含来自database1的table1的记录,第二个ResultSet包含来自database2的table2的记录。我需要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 :(得分:1)

该异常表示问题所在 - 您的结果集不支持删除。为了获得可更新的结果集,有一些要求:

准备语句时,是否使用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

如果这是目标

答案 1 :(得分:1)

你的逻辑:

  1. 假设记录按某种顺序排列(可能是也可能不是,取决于您的SQL)
  2. 为结果集1的每一行使用整个结果集2,这不太可能是您的意图
  3. 删除内容,这也不是您在问题中提到的内容
  4. 您的问题可以轻松实现:

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

    这将打印第一个结果集中存在但不存在于第二个结果集中的所有值(不重复)。