Как проверить, есть ли в наборе результатов одна строка или более? - PullRequest
23 голосов
/ 07 апреля 2010

Как проверить, есть ли в наборе результатов одна строка или более с JDBC?

Ответы [ 8 ]

29 голосов
/ 07 апреля 2010
ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
boolean isMoreThanOneRow = rs.first() && rs.next();

Вы не задавали этот вопрос, но он может вам понадобиться:

boolean isEmpty = ! rs.first();

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

ResultSet rs = stmt.executeQuery("SELECT a, b, c FROM Table1");
while (rs.next()) {
    // retrieve and print the values for the current row
    int i = rs.getInt("a");
    String s = rs.getString("b");
    float f = rs.getFloat("c");
    System.out.println("ROW = " + i + " " + s + " " + f);
}

Однако в некоторых случаях вам может потребоваться окно результатов, и вам необходимо заранее подсчитать количество записей, чтобы отобразить для пользователя что-то вроде Row 1 to 10 of 100.Сначала вы можете выполнить отдельный запрос с помощью SELECT COUNT(*), чтобы получить количество записей, но учтите, что это приблизительное число, так как строки могут быть добавлены или удалены за время, необходимое для выполнения двух запросов.

Образец из Обзор ResultSet

1 голос
/ 07 апреля 2010

Вам не нужен JDBC для этого. Обычная идиома состоит в том, чтобы собрать все результаты в коллекции и использовать методы сбора, такие как List#size().

List<Item> items = itemDAO.list();

if (items.isEmpty()) {
    // It is empty!
if (items.size() == 1) {
    // It has only one row!
} else {
    // It has more than one row!
}

где метод list() выглядит примерно так:

public List<Item> list() throws SQLException {
    Connection connection = null;
    Statement statement = null;
    ResultSet resultSet = null;
    List<Item> items = new ArrayList<Item>();

    try {
        connection = database.getConnection();
        statement = connection.createStatement();
        resultSet = statement.executeQuery(SQL_LIST);
        while (resultSet.next()) {
            Item item = new Item();
            item.setId(resultSet.getLong("id"));
            item.setName(resultSet.getString("name"));
            // ...
            items.add(item);
        }
    } finally {
        if (resultSet != null) try { resultSet.close(); } catch (SQLException logOrIgnore) {}
        if (statement != null) try { statement.close(); } catch (SQLException logOrIgnore) {}
        if (connection != null) try { connection.close(); } catch (SQLException logOrIgnore) {}
    }

    return items;
}
1 голос
/ 07 апреля 2010

Есть много вариантов, и так как вы не предоставляете больше контекста, остается только догадываться. Мои ответы отсортированы по сложности и производительности в порядке возрастания.

  1. Просто запустите select count(1) FROM ... и получите ответ. Вам нужно будет выполнить другой запрос, который фактически выбирает и возвращает данные.
  2. Итерируйте с rs.next() и считайте, пока не будете счастливы. Затем, если вам все еще нужны фактические данные, повторите тот же запрос.
  3. Если ваш драйвер поддерживает обратную итерацию, перейдите пару раз rs.next() и затем вернитесь назад с помощью rs.previous().
0 голосов
/ 14 июня 2019

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

ResultSet result = stmt.executeQuery("SELECT * FROM Table");

if(result.next()) {
   // Duplicate the code which should be pasted inside while
   System.out.println(result.getInt(1));
   System.out.println(result.getString(2));

   while(result.next()){
   System.out.println(result.getInt(1));
   System.out.println(result.getString(2));
   }
}else{
System.out.println("Query result is empty");
}

Недостатки:

  1. В этой реализации часть кода будет продублирована.
  2. Вы не можете знать, сколько строк присутствует в результате.
0 голосов
/ 22 августа 2017

Если вы хотите убедиться, что точно одна строка, вы можете убедиться, что первая строка является последней:

ResultSet rs = stmt.executeQuery("SELECT a FROM Table1 WHERE b=10");
if (rs.isBeforeFirst() && rs.next() && rs.isFirst() && rs.isLast()) {
    // Logic for where there's exactly 1 row
    Long valA = rs.getLong("a");    
    // ... 
} 
else {  
    // More that one row or 0 rows returned.    
    // .. 
}
0 голосов
/ 15 июня 2016
public int rowCountValue(ResultSet rsValue) throws SQLException {
    ResultSet rowCountValue = rsValue;
    int countRow = 0;
    while (rowCountValue.next()) {
        countRow++;
    }
    return countRow;
}
0 голосов
/ 29 июля 2011

Получите количество строк, используя класс ResultSetMetaData.

Из вашего кода вы можете создать ResultSetMetaData как:

ResultSetMetaData rsmd = resultSet.getMetaData();   //get ResultSetMetaData
rsmd.getColumnCount();       // get row count from resultsetmetadata
0 голосов
/ 07 апреля 2010

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

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

Вы также можете напрямую запросить эту информацию у SQL, выполнив SELECT COUNT(*) в оставшейся части запроса; результат будет 0, 1 или более в зависимости от того, сколько строк вернет остальная часть запроса. Это довольно легко реализовать, но включает в себя два запроса к БД, при условии, что вы захотите прочитать и обработать фактический запрос следующим.

...