Модераторы: LSD, AntonSaburov
  

Поиск:

Ответ в темуСоздание новой темы Создание опроса
> Spring - как отобразить размер коллекции, Spring - как отобразить размер коллекции 
V
    Опции темы
dimanenok
Дата 3.4.2009, 19:15 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.5.2008

Репутация: нет
Всего: нет



Есть проблема. Есть багтреккер на Spring+Hibernate.
В нем страничка где список багов. 
Метод который готовит данные для странички - выдергивает для каждого бага только те поля-объекты которые отобразятся на странице списка багов, поскольку lazy везде стоит false.
Код

    public List getIssueList() {
        List<Issue> issueList = issueDAO.findAll();
        Iterator<Issue> it = issueList.iterator();
        while (it.hasNext()) {
            Issue issue = (Issue)it.next();
            getHibernateTemplate().refresh(issue);
            getHibernateTemplate().initialize(issue.getStatus());
            getHibernateTemplate().initialize(issue.getSubmitter());
            getHibernateTemplate().initialize(issue.getClientType());
        }
        return issueList;
    }

У каждого бага еще есть коллекция комментариев, их может быть очень много.
Задача - как не инициализируя эти комментарии отобразить их количество для каждого бага?
Скажем есть 100 багов на странице, у каждого в среднем по 10 комментариев и нельзя чтобы только изза того что надо показать колонку с циферкой количества комментариев проинициализировались 1000 объектов в памяти. Можно специально добавить поле к багу где это количество комментариев будет храниться, но это приведет к лишним операциям по поддержанию поля в актуальном состоянии, наверняка Spring позволяет решить эту проблему както изящнее.

Кто-то что подобное уже делал? Буду благодарен за любые наводки  smile 

Это сообщение отредактировал(а) powerOn - 4.4.2009, 00:01
PM MAIL   Вверх
ecologist
Дата 3.4.2009, 20:36 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Опытный
**


Профиль
Группа: Участник
Сообщений: 452
Регистрация: 28.2.2007

Репутация: 5
Всего: 9



Можно попробовать сделать вычисляемое поле - смотри аннотацию @Formula - там можно просто задать SQL который будет вычислять это поле - вбиваем туда SELECT COUNT(*) FROM.

Не буду гарантировать, что это точно поможет - но можно попробовать.
PM MAIL   Вверх
lando1
Дата 4.4.2009, 07:59 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Шустрый
*


Профиль
Группа: Участник
Сообщений: 138
Регистрация: 30.4.2007

Репутация: нет
Всего: нет



по-моему все же лучше добавить дополнительное поле в бд, где хранить число постов. 

Это сильно ускорит процесс выдачи данных, иначе в вашем примере придется еще 100 раз вызвать (SELECT COUNT(*) FROM)
PM MAIL ICQ   Вверх
dimanenok
Дата 5.4.2009, 22:16 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Новичок



Профиль
Группа: Участник
Сообщений: 9
Регистрация: 11.5.2008

Репутация: нет
Всего: нет



Цитата(ecologist @ 3.4.2009,  20:36)
Можно попробовать сделать вычисляемое поле - смотри аннотацию @Formula - там можно просто задать SQL который будет вычислять это поле - вбиваем туда SELECT COUNT(*) FROM.

Не буду гарантировать, что это точно поможет - но можно попробовать.

Большое спасибо за совет! Добавил вычисляемое поле commentsnumber у класса Issue и мапинг
        <property name="commentsnumber" type="java.lang.Integer" not-null="true"
        lazy="true" formula="( SELECT COUNT(*) FROM ISSUE_COMMENT ic where ic.CISSUE=CID )">
        </property>
И вывод числа комментариев для каждого бага работает.
Но только вот к моему удивлению агрегатная функция COUNT подтянула на страницу все комментарии багов (которые в списке багов конечно не нужны), вместо того чтобы вернуть цифру и забыть о них (
Это наверно уже нельзя побороть, такое свойство хибернейта?
PM MAIL   Вверх
COVD
Дата 6.4.2009, 00:09 (ссылка) | (нет голосов) Загрузка ... Загрузка ... Быстрая цитата Цитата


Эксперт
***


Профиль
Группа: Завсегдатай
Сообщений: 1655
Регистрация: 26.7.2005

Репутация: 4
Всего: 43



Цитата

по-моему все же лучше добавить дополнительное поле в бд

количество записей для каждого ID можно получить одним запросом SELECT ID, COUNT(*) FROM ... GROUP BY ID 

Это сообщение отредактировал(а) COVD - 6.4.2009, 00:13
PM MAIL   Вверх
  
Ответ в темуСоздание новой темы Создание опроса
Правила форума "Java"
LSD   AntonSaburov
powerOn   tux
  • Прежде, чем задать вопрос, прочтите это!
  • Книги по Java собираются здесь.
  • Документация и ресурсы по Java находятся здесь.
  • Используйте теги [code=java][/code] для подсветки кода. Используйтe чекбокс "транслит", если у Вас нет русских шрифтов.
  • Помечайте свой вопрос как решённый, если на него получен ответ. Ссылка "Пометить как решённый" находится над первым постом.
  • Действия модераторов можно обсудить здесь.
  • FAQ раздела лежит здесь.

Если Вам помогли, и атмосфера форума Вам понравилась, то заходите к нам чаще! С уважением, LSD, AntonSaburov, powerOn, tux.

 
1 Пользователей читают эту тему (1 Гостей и 0 Скрытых Пользователей)
0 Пользователей:
« Предыдущая тема | Java EE (J2EE) и Spring | Следующая тема »


 




[ Время генерации скрипта: 0.0681 ]   [ Использовано запросов: 21 ]   [ GZIP включён ]


Реклама на сайте     Информационное спонсорство

 
По вопросам размещения рекламы пишите на vladimir(sobaka)vingrad.ru
Отказ от ответственности     Powered by Invision Power Board(R) 1.3 © 2003  IPS, Inc.