Сравнение результатов в jdbc - PullRequest
5 голосов
/ 05 июля 2011

В моем Java-коде у меня есть два набора результатов rs1 и rs2, полученные следующим образом:

rs1 = statement.executeQuery("select * from tableA")
rs2 = statement.executeQuery("select * from tableB")

Обе таблицы имеют одинаковую схему, состоящую из идентификатора поля, имени и адреса, и я хочу сравнить два набора результатов. Могу ли я напрямую сделать rs1 == rs2? Если нет, как я должен идти о сравнении двух наборов результатов? Некоторый пример был бы очень признателен.

Спасибо

Ответы [ 4 ]

5 голосов
/ 29 ноября 2012

Этот код проверяет все столбцы двух наборов результатов, а также количество строк в них должно быть равным.

    int col = 1;
    while (rs1.next() && rs2.next()) {
        final Object res1 = rs1.getObject(col);
        final Object res2 = rs2.getObject(col);
        // Check values
        if (!res1.equals(res2)) {
            throw new RuntimeException(String.format("%s and %s aren't equal at common position %d",
                res1, res2, col));
        }

        // rs1 and rs2 must reach last row in the same iteration
        if ((rs1.isLast() != rs2.isLast())) {
            throw new RuntimeException("The two ResultSets contains different number of columns!");
        }

        col++;
    }
5 голосов
/ 05 июля 2011

В JDBC вам придется перебирать оба ResultSet объекта и сравнивать каждое поле в них.

Если вы можете сделать это с помощью SQL, я бы попробовал

select * from tableA
except -- or minus in oracle
select * from tableB

и

select * from tableB
except -- or minus in oracle
select * from tableA

Оба должны возвращать пустой результат

Если для вас есть возможность использовать библиотеку, вы можете попробовать jOOQ (я работаю в компании, специализирующейся на jOOQ). JOOQ включает множество полезных функций вокруг JDBC. С jOOQ вы можете запустить

Result<Record> r1 = create.fetch("select * from tableA");
Result<Record> r2 = create.fetch("select * from tableB");

или также:

r1 = create.fetch(rs1);
r2 = create.fetch(rs2);

А потом

if (r1.equals(r2)) {
    // the results are equal
}
else {
    // the results are not equal
}
0 голосов
/ 05 июля 2011

Так как rs1 & rs2 являются разными объектами, они указывают на другое место в памяти, поэтому сравнение rs1 & rs2 некорректно, скорее вы используете код ниже: -

while (rs.next()&& rs1.next())
{
  int userId = rs.getInt("userId")
  int userId1 = rs1.getInt("userId")
  if(userId == userId1){
   // do some thing
  }

}
0 голосов
/ 05 июля 2011

rs1 и rs2 не будут одинаковыми объектами, поэтому сравнивать их довольно бессмысленно.Полагаю, вы хотите сравнить содержимое наборов результатов.

Схему таблицы можно получить из метаданных с помощью rs1.getMetaData ().

...