Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > Java EE (J2EE) и Spring > Spring - как отобразить размер коллекции


Автор: dimanenok 3.4.2009, 19:15
Есть проблема. Есть багтреккер на 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 

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

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

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

Это сильно ускорит процесс выдачи данных, иначе в вашем примере придется еще 100 раз вызвать (SELECT COUNT(*) FROM)

Автор: dimanenok 5.4.2009, 22:16
Цитата(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 подтянула на страницу все комментарии багов (которые в списке багов конечно не нужны), вместо того чтобы вернуть цифру и забыть о них (
Это наверно уже нельзя побороть, такое свойство хибернейта?

Автор: COVD 6.4.2009, 00:09
Цитата

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

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

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)