Я реализую пейджинг в своем приложении. Для этого я запускаю запрос и получаю ResultSet.
Теперь я хочу получить общее количество записей в этом ResultSet для расчета подкачки.
Как я могу это получить? Я не хочу выполнять дополнительный SQL, который дает мне общее количество строк.
Всего строк JDBC ResultSet
Ответы (7)
Другой вариант — добавить агрегацию счетчика в качестве подзапрошенного столбца в ваш запрос. Если ваша база данных немного умнее, она выполнит это только один раз. Вы должны быть в состоянии легко проверить это, используя анализатор запросов в вашей любимой базе данных.
SELECT id,username,(SELECT COUNT(id) FROM users) FROM users;
Обычная практика состоит в том, чтобы сопоставить 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!
}
COUNT(*)
(или лучше COUNT(pk)
) и другой для получения интересующих строк. Хотя это, вероятно, не полностью соответствует вашим требованиям (веб-приложение JSF), вы можете получить некоторую полезную информацию из этой статьи.
- person BalusC; 15.06.2010
Если я не ошибаюсь, поведение по умолчанию для ResultSet заключается в том, чтобы не получать все строки сразу, поэтому из самого объекта невозможно узнать, сколько строк будет возвращено из запроса без предварительной итерации (и, следовательно, получения ) все они. Вы можете получить другое поведение с определенными драйверами JDBC для определенных баз данных.
Могу я спросить, почему вам слишком дорого сначала запускать запрос COUNT()? По сравнению со стоимостью получения фактических значений это не должно быть слишком дорого.
Из комментария к ответу BalusC:
[...] На самом деле я не хочу получать все строки в коллекции, потому что я хочу отображать только 10 строк на странице, поэтому мой расчет подкачки помогает мне получить только 10 строк из набора результатов. Для этого мне нужно общее количество строк в наборе результатов
Вам не нужно ничего, кроме как запросить у базы данных около 10 строк и размер таблицы. так что у вас фактически есть два (2) вопроса к вашему хранилищу данных, что равно двум (2) запросам на выбор. Сделайте это, как предложил Uri, и не заботьтесь о "наилучшей практике". Если однажды кто-то предложит лучшую практику, вы все равно сможете решить, адаптировать свой код или нет.
Нет смысла подсчитывать размер списка, чтобы получить количество записей, поскольку мы реализуем разбиение на страницы и НЕ ДОЛЖНЫ загружать весь набор результатов за раз.
Я использую ROW_NUM на уровне базы данных для реализации логики разбиения на страницы. Нам нужно получить столько записей, сколько нужно для отображения на экране.
Пример: выберите * из Emp, где rownum>=:beginRecord и rownum‹=:endRecord
***** Логика останется прежней, но синтаксис может измениться в зависимости от типа базы данных. Нужно использовать вложенный запрос, если нам нужно упорядочить любой столбец. *
Я считаю, что count(*) - дорогая операция, скорее я предпочитаю разбиение.
Выберите Eno, Ename , (выберите count() из emp) в качестве record_count из Emp -- Expensive Выберите Eno, Ename , count() over (partition by eno) в качестве record_count из Emp -- Предпочтительный.
***** Разделение по синтаксису может меняться в зависимости от типа базы данных.*
Я рассмотрел базу данных Oracle.
в дополнение к решению Fathah вы можете использовать этот код, также обратите внимание, что, поскольку это указатель памяти, это решение не имеет проблем с производительностью:
int totalRows = 0;
if(rowSet.last()) {
totalRows = rowSet.getRow();
}
rowSet.beforeFirst();