br.com.tcc.service.persistence.PaginationHelper.java Source code

Java tutorial

Introduction

Here is the source code for br.com.tcc.service.persistence.PaginationHelper.java

Source

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package br.com.tcc.service.persistence;

import java.util.List;

import org.hibernate.Criteria;
import org.hibernate.criterion.Projection;
import org.hibernate.criterion.Projections;

/**
 * <p>Classe utilitria para simplificar a criao e modificao de criterias paginadas.</p>
 *
 * @author UP21
 */
public final class PaginationHelper {

    /**
     * Construtor privado, como helper deve ser utilizado somente atravs
     * de seus mtodos estticos.
     */
    private PaginationHelper() {

    }

    /**
     * <p>
     * Executa o criteria dado retornando o resultado em uma PagedList de T.
     * </p>
     * <p>
     * <b>ATENO:</b> Este mtodo <b>altera permanentemente</b> o objeto {@link Criteria} recebido como parmetro. Qualquer {@link Projection} ou {@link ResultTransformer} configurado no criteria
     * <b>ser substitudo</b>.
     * </p>
     * <p>Utilize o mtodo {@code executeCriteriaForPagination(Pagination,
     *              Criteria, boolean)} caso sua consulta precise de <code>SQL DISTINCT</code>.</p>
     *
     * @param <T> Tipo de Entidade que ser retornada na PagedList
     * @param pagination Paginao utilizada
     * @param criteria criteria
     * @return pagedList de T
     */
    public static <T> PagedList<T> executeCriteriaForPagination(final Pagination pagination,
            final Criteria criteria) {
        return executeCriteriaForPagination(pagination, criteria, false);
    }

    /**
     * <p>
     * Executa o criteria dado retornando o resultado em uma PagedList de T.
     * </p>
     * <p>
     * <b>ATENO:</b> Este mtodo <b>altera permanentemente</b> o objeto {@link Criteria} recebido como parmetro. Qualquer {@link Projection} ou {@link ResultTransformer} configurado no criteria
     * <b>ser substitudo</b>.
     * </p>
     * <p>
     * Use o parmetro <code>distinct</code> para definir se o {@link ResultTransformer} deve ser
     * {@link Criteria.DISTINCT_ROOT_ENTITY} ou apenas {@link Criteria.ROOT_ENTITY}
     * e se deve ser usado <code>distinct count(*)</code> ou apenas <code>count(*)</code>.
     * </p>
     *
     * @param <T> Tipo de Entidade que ser retornada na PagedList
     * @param pagination Paginao utilizada
     * @param criteria criteria
     * @param distinct Se a consulta deve usar <code>SQL DISTINCT</code>.
     * @return pagedList de T
     */
    public static <T> PagedList<T> executeCriteriaForPagination(final Pagination pagination,
            final Criteria criteria, boolean distinct) {

        criteria.setFirstResult(0);
        Pagination paginationToReturn = getTotalItemsForCriteria(criteria, pagination, distinct);
        CriteriaHelper.addOrderCriteria(criteria, pagination.getOrdering());
        final List<T> list = criteria.setFirstResult(pagination.getFirstItemIndex())
                .setMaxResults(pagination.getPageSize()).list();

        return new PagedList<T>(list, paginationToReturn);
    }

    /**
     * <p>
     * <b>ATENO:</b> Este mtodo <b>altera permanentemente</b> o objeto {@link Criteria} recebido como parmetro. Qualquer {@link Projection} ou {@link ResultTransformer} configurado no criteria
     * <b>ser substitudo</b>.
     * </p>
     * <p>
     * Use o parmetro <code>distinct</code> para definir se o {@link ResultTransformer} deve ser
     * {@link Criteria.DISTINCT_ROOT_ENTITY} ou apenas {@link Criteria.ROOT_ENTITY}
     * e se deve ser usado <code>distinct count(*)</code> ou apenas <code>count(*)</code>.
     * </p>
     * @param criteria O Criteria a ser utilizado
     * @param pagination O objeto com a paginao desejada.
     * @param distinct Se a consulta deve usar <code>SQL DISTINCT</code>.
     * @return Um novo objeto de paginao referente  consulta atual.
     */
    private static Pagination getTotalItemsForCriteria(Criteria criteria, Pagination pagination, boolean distinct) {

        Projection count = Projections.rowCount();
        if (distinct) {
            count = Projections.distinct(count);
        }
        int totalItems = (Integer) criteria.setProjection(count).uniqueResult();
        criteria.setProjection(null)
                .setResultTransformer(distinct ? Criteria.DISTINCT_ROOT_ENTITY : Criteria.ROOT_ENTITY);
        return new Pagination(pagination.getPageSize(), pagination.getCurrentPage(), totalItems,
                pagination.getOrdering());

    }

}