我有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;
答案 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)
你的逻辑:
您的问题可以轻松实现:
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);
这将打印第一个结果集中存在但不存在于第二个结果集中的所有值(不重复)。