JDBC ResultSet всего строк - PullRequest
       27

JDBC ResultSet всего строк

2 голосов
/ 14 июня 2010

Я использую пейджинг в своем приложении.Для этого я запускаю запрос и получаю ResultSet.
Теперь я хочу получить общее количество записей в этом ResultSet для моего расчета подкачки.
Как я могу получить это?Я не хочу выполнять дополнительный SQL, который дает мне общее количество строк.

Ответы [ 7 ]

2 голосов
/ 26 июня 2012
int totalRows = 0;
    try    {
        resultSet.last();
        totalRows = resultSet.getRow();
        resultSet.beforeFirst();
    } catch(Exception ex)  {
               return 0;
          }
    return totalRows ;
2 голосов
/ 14 июня 2010

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

SELECT id,username,(SELECT COUNT(id) FROM users) FROM users;
2 голосов
/ 14 июня 2010

Обычная практика заключается в сопоставлении ResultSet с List<Entity>, где Entity - это javabean, представляющий фактические данные, например, User, Product, Order и т. Д.

Затем вы можете просто использовать List методы, такие как List#size(), чтобы получить количество строк.

List<Entity> entities = entityDAO.list();
int rows = entities.size();

if (entities.isEmpty()) {
    // It is empty!
} else if (entities.size() == 1) {
    // It has only one row!
} else {
    // It has more than one row!
}
1 голос
/ 15 июня 2010

От комментария до Ответ BalusC :

[...] На самом деле я не хочу получать все строки в коллекции, потому что я хочу отображать только 10 строкстраница, таким образом, мой расчет подкачки помогает мне получить только 10 строк из набора результатов.Для этого мне нужно общее количество строк в наборе результатов

Вам ничего не нужно, кроме запроса к базе данных примерно 10 строк и размера таблицы.таким образом, у вас есть два (2) вопроса к вашему хранилищу данных, что равно двум (2) запросам выбора.Сделайте это в соответствии с предложением Uri и не заботьтесь о «наилучшей практике».Если однажды кто-то придет с лучшей практикой, вы все равно сможете решить, следует ли адаптировать ваш код или нет.

1 голос
/ 14 июня 2010

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

Могу ли я спросить, почему для вас слишком дорого сначала выполнить запрос COUNT ()?По сравнению со стоимостью извлечения фактических значений, это не должно быть слишком дорого.

0 голосов
/ 08 января 2013

в дополнение к решению Fathah вы можете использовать этот код, также обратите внимание, что из-за указателя памяти это решение не имеет проблем с производительностью:

int totalRows = 0;
if(rowSet.last()) {
   totalRows = rowSet.getRow();
}
rowSet.beforeFirst();
0 голосов
/ 21 июня 2012

Нет смысла в подсчете размера списка для получения количества записей, так как мы реализуем нумерацию страниц и НЕ ДОЛЖНЫ загружать весь набор результатов за раз.

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

Пример: выберите * из Emp, где rownum> =: beginRecord и rownum <=: endRecord </p>

Логика будет такой же, но синтаксис может меняться в зависимости от типа базы данных. Нужно использовать вложенный запрос, если нам нужно сделать заказ по любому столбцу.

Полагаю, count (*) - дорогая операция, я предпочитаю разделение по.

Выберите Eno, Ename, (выберите количество (*) из emp) в качестве record_count из Emp - Дорого Выберите Eno, Ename, count (*) over (split by eno) в качестве record_count из Emp - Предпочтительный.

Разделение по синтаксису может изменяться в зависимости от типа базы данных.

Я рассмотрел базу данных Oracle.

Не стесняйтесь комментировать / обсуждать.

Спасибо и С уважением, Локеш Рангинени.

...