Как получить различное количество строк корневого объекта в спящем режиме? - PullRequest
4 голосов
/ 07 октября 2010

Я должен показать Сотрудника и его Проект в раскрывающемся списке сотруднику в правильной табличной форме.В верхней части мне нужно показать количество записей.Итак, я делаю два запроса, один для получения количества и другой для получения сотрудника и его проекта. Наконец, общее количество приходит сотрудник * проект количество.

Если у сотрудника есть 3 проекта, то он считается до 3. Но мне нужно только количество сотрудников.И я получаю отдельный Employee объект, у этого объекта работника есть список Project.

Я использовал .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY), чтобы получить вот так.

Пожалуйста, помогите мне получить только количество сотрудников вместо сотрудник * проект , я борюсь с этим.

Мой код:

public Collection fetchEmployeeWithProject(final List condition,
            final PaginationCriteria pageCriteria)
            throws DataAccessLayerException {
                 Session session = this.getPersManager().getCurrentSession();

        Criteria criteria = session.createCriteria(Employee.class, "employee")
                .createAlias(
                        "employee.empProject", "empProject",
                        CriteriaSpecification.LEFT_JOIN).createAlias(
                        "empProject.Project", "project",
                        CriteriaSpecification.LEFT_JOIN);
        criteria = this.addMultipleSeachCriteria(criteria, condition);
        this.buildPaginatedCriteria(criteria, pageCriteria);
        List lst = criteria.list();
        session.clear();
    return lst;
    }

protected Criteria buildPaginatedCriteria(Criteria criteria,
            PaginationCriteria pageCriteria) throws DataAccessLayerException {

        logger.debug(LOG_PREFIX + "buildPaginatedCriteria::Begin");

        if (pageCriteria != null) {

            if (!pageCriteria.isFetchAll()) {

                if (pageCriteria.getTotalRecords() == 0)
                    pageCriteria.setTotalRecords(((Integer) criteria
                            .setProjection(Projections.rowCount())
                            .uniqueResult()).intValue());
                criteria.setProjection(null);
                criteria.setFirstResult(
                        pageCriteria.getFirstRecordOfCurrentPage())
                        .setMaxResults(pageCriteria.getRecordsPerPage());
            }

            if (StringUtils.isNotBlank(pageCriteria.getSortBy()))
                criteria.addOrder(pageCriteria.isSortDescending() ? Order
                        .desc(pageCriteria.getSortBy()) : Order
                        .asc(pageCriteria.getSortBy()));

            if (StringUtils.isNotBlank(pageCriteria.getSecondarySortBy())) {
                criteria.addOrder(Order.asc(pageCriteria.getSecondarySortBy()));
            }

            if (pageCriteria.isCached()) {
                criteria.setCacheable(true).setCacheMode(CacheMode.NORMAL);
            }
        }
        criteria
                .setResultTransformer(CriteriaSpecification.DISTINCT_ROOT_ENTITY);

        logger.debug(LOG_PREFIX + "buildPaginatedCriteria::End");

        return criteria;
    }

Это методы, которыми я являюсьиспользование.

1 Ответ

1 голос
/ 07 октября 2010

В Hibernate есть проблема при выполнении объединений и попытке подсчета. Проблема с DISTINCT_ROOT_ENTITY состоит в том, что он удаляет равные строки, но поскольку вы сделали соединение, некоторые строки имеют разные поля, хотя это одна и та же сущность.

Если вы хотите считать и выполнять объединения одновременно, поместите все полученные объекты в Set. Таким образом, дубликаты исчезнут. Тогда вы можете сделать Set#size для подсчета.

Или вы можете использовать HQL и написать свой запрос вручную.

Возможно, если вы отредактируете свой вопрос и добавите фактические запросы, которые вы создаете, мы можем помочь вам в дальнейшем.

Обновление

Добавьте это после: List lst = criteria.list();

Set<Employee> employeeSet = new HashSet<Employee>();
employeeSet.addAll(lst);
return employeeSet;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...