Подтвердить что ты не робот

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

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

4b9b3361

Ответ 1

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

Ответ 2

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

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

Ответ 3

Для этого вам не нужен 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;
}

Ответ 4

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

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

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

Ответ 5

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

ResultSet rs = stmt.executeQuery("SELECT a FROM Table1 WHERE b=10");
if (rs.isBeforeFirst() && rs.next() && rs.isFirst() && rs.isLast()) {
    // Logic for where there exactly 1 row
    Long valA = rs.getLong("a");    
    // ... 
} 
else {  
    // More that one row or 0 rows returned.    
    // .. 
}

Ответ 6

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

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. Вы не можете знать, сколько строк присутствует в результате.

Ответ 7

public int rowCountValue(ResultSet rsValue) throws SQLException {
    ResultSet rowCountValue = rsValue;
    int countRow = 0;
    while (rowCountValue.next()) {
        countRow++;
    }
    return countRow;
}

Ответ 8

Получите счетчик строк с помощью класса ResultSetMetaData.

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

ResultSetMetaData rsmd = resultSet.getMetaData();   //get ResultSetMetaData
rsmd.getColumnCount();       // get row count from resultsetmetadata