2012-06-07 3 views
0

Я реализую разбивку на страницы по набору результатов из спящего режима. В настоящее время я делаюПодсчет результатов из Hibernate

long count = getCountResultForNamedQuery(); 
List result = getResultForNamedQuery() 

где два запроса что-то вроде

select count(*) from addresses where country = 'USA'; 

и

select * from addresses where country = 'USA'; 

Для пагинацией я обычно обновлять getResultForQuery так что имеет .setFirstResult и setMaxResult установлен. Затем будет возвращен только тот раздел, который я хочу. Мне нужно сделать подсчет, чтобы я знал, сколько страниц будет показано на странице страницы страницы.

Мне было интересно, могу ли я быть более эффективным. Могу ли я просто сделать

List result = getResultForQuery(); 
int count = result.size(); 
List subResult = result.subList(start, end); 

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

Извините, если пример недостаточно ясен. Я попытался максимально упростить его и, возможно, упростил его!

Заранее благодарен!

ответ

2

Ваше второе решение имеет смысл, но может привести к катастрофе для производительности, так как он будет загружен в память все адреса из США, тогда как вас интересует только их количество и в небольшом диапазоне этих адресов. Когда вы выполняете запрос, запрос возвращает список, и этот список заполняется всеми результатами запроса. Вот почему setFirstResult и setMaxResults полезны.

Если вам не нужны абсолютно точные подсчеты, вы можете выполнить запрос на подсчет только один раз и выполнить запрос «результат» для каждой страницы.

+0

Спасибо за ответ. Я думаю, это ответ на мой вопрос. Я не был уверен, будут ли загружены все адреса США. Я понял, что Hibernate только возвращает оболочки объектов, а затем явным образом извлекает каждое поле, когда на него фактически был обращен код. Я не был уверен, что размер() будет делать в списке результатов - отсюда мои вопросы – RNJ

+0

Я действительно советую вам включить ведение журнала SQL при разработке с помощью Hibernate. Это заставит вас понять, когда Hibernate выполняет запросы, какие запросы он выполняет, и что вы можете сделать, чтобы избежать ненужных запросов. –

0

можно сделать следующим образом -

Query query = getSession().createQuery("your Query").setFirstResult(start_Index).setMaxResults(Number_Of_Records_You_Want_to_Display_on_page); 

Для примера -

Query query = getSession().createQuery("select * from employee").setFirstResult(101).setMaxResults(100); 
+0

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

+0

не получил вас правильно –

Смежные вопросы