package br.mp.mprj.portal.portlet.gestaomensagens.service.service.persistence;

import br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.MensagemWorkflow;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowImpl;
import br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl;
import br.mp.mprj.portal.portlet.gestaomensagens.service.service.persistence.MensagemWorkflowPersistence;

import com.liferay.portal.kernel.cache.CacheRegistryUtil;
import com.liferay.portal.kernel.dao.orm.EntityCacheUtil;
import com.liferay.portal.kernel.dao.orm.FinderCacheUtil;
import com.liferay.portal.kernel.dao.orm.FinderPath;
import com.liferay.portal.kernel.dao.orm.Query;
import com.liferay.portal.kernel.dao.orm.QueryPos;
import com.liferay.portal.kernel.dao.orm.QueryUtil;
import com.liferay.portal.kernel.dao.orm.Session;
import com.liferay.portal.kernel.exception.SystemException;
import com.liferay.portal.kernel.log.Log;
import com.liferay.portal.kernel.log.LogFactoryUtil;
import com.liferay.portal.kernel.util.GetterUtil;
import com.liferay.portal.kernel.util.InstanceFactory;
import com.liferay.portal.kernel.util.OrderByComparator;
import com.liferay.portal.kernel.util.PropsKeys;
import com.liferay.portal.kernel.util.PropsUtil;
import com.liferay.portal.kernel.util.SetUtil;
import com.liferay.portal.kernel.util.StringBundler;
import com.liferay.portal.kernel.util.StringPool;
import com.liferay.portal.kernel.util.StringUtil;
import com.liferay.portal.kernel.util.UnmodifiableList;
import com.liferay.portal.kernel.util.Validator;
import com.liferay.portal.kernel.uuid.PortalUUIDUtil;
import com.liferay.portal.model.CacheModel;
import com.liferay.portal.model.ModelListener;
import com.liferay.portal.service.persistence.impl.BasePersistenceImpl;

import java.io.Serializable;

import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import java.util.Set;

/**
 * The persistence implementation for the mensagem workflow service.
 *
 * <p>
 * Caching information and settings can be found in <code>portal.properties</code>
 * </p>
 *
 * @author Henrique Simoes
 * @see MensagemWorkflowPersistence
 * @see MensagemWorkflowUtil
 * @generated
 */
public class MensagemWorkflowPersistenceImpl extends BasePersistenceImpl<MensagemWorkflow>
    implements MensagemWorkflowPersistence {
    /*
     * NOTE FOR DEVELOPERS:
     *
     * Never modify or reference this class directly. Always use {@link MensagemWorkflowUtil} to access the mensagem workflow persistence. Modify <code>service.xml</code> and rerun ServiceBuilder to regenerate this class.
     */
    public static final String FINDER_CLASS_NAME_ENTITY = MensagemWorkflowImpl.class.getName();
    public static final String FINDER_CLASS_NAME_LIST_WITH_PAGINATION = FINDER_CLASS_NAME_ENTITY +
        ".List1";
    public static final String FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION = FINDER_CLASS_NAME_ENTITY +
        ".List2";
    public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_ALL = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED,
            MensagemWorkflowImpl.class, FINDER_CLASS_NAME_LIST_WITH_PAGINATION,
            "findAll", new String[0]);
    public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED,
            MensagemWorkflowImpl.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findAll", new String[0]);
    public static final FinderPath FINDER_PATH_COUNT_ALL = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED, Long.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countAll", new String[0]);
    public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED,
            MensagemWorkflowImpl.class, FINDER_CLASS_NAME_LIST_WITH_PAGINATION,
            "findByUuid",
            new String[] {
                String.class.getName(),
                
            Integer.class.getName(), Integer.class.getName(),
                OrderByComparator.class.getName()
            });
    public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED,
            MensagemWorkflowImpl.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByUuid",
            new String[] { String.class.getName() },
            MensagemWorkflowModelImpl.UUID_COLUMN_BITMASK);
    public static final FinderPath FINDER_PATH_COUNT_BY_UUID = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED, Long.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByUuid",
            new String[] { String.class.getName() });
    private static final String _FINDER_COLUMN_UUID_UUID_1 = "mensagemWorkflow.uuid IS NULL";
    private static final String _FINDER_COLUMN_UUID_UUID_2 = "mensagemWorkflow.uuid = ?";
    private static final String _FINDER_COLUMN_UUID_UUID_3 = "(mensagemWorkflow.uuid IS NULL OR mensagemWorkflow.uuid = '')";
    public static final FinderPath FINDER_PATH_WITH_PAGINATION_FIND_BY_MENSAGEMID =
        new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED,
            MensagemWorkflowImpl.class, FINDER_CLASS_NAME_LIST_WITH_PAGINATION,
            "findByMensagemId",
            new String[] {
                Long.class.getName(),
                
            Integer.class.getName(), Integer.class.getName(),
                OrderByComparator.class.getName()
            });
    public static final FinderPath FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_MENSAGEMID =
        new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED,
            MensagemWorkflowImpl.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "findByMensagemId",
            new String[] { Long.class.getName() },
            MensagemWorkflowModelImpl.MENSAGEMID_COLUMN_BITMASK);
    public static final FinderPath FINDER_PATH_COUNT_BY_MENSAGEMID = new FinderPath(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowModelImpl.FINDER_CACHE_ENABLED, Long.class,
            FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION, "countByMensagemId",
            new String[] { Long.class.getName() });
    private static final String _FINDER_COLUMN_MENSAGEMID_MENSAGEMID_2 = "mensagemWorkflow.mensagemId = ?";
    private static final String _SQL_SELECT_MENSAGEMWORKFLOW = "SELECT mensagemWorkflow FROM MensagemWorkflow mensagemWorkflow";
    private static final String _SQL_SELECT_MENSAGEMWORKFLOW_WHERE = "SELECT mensagemWorkflow FROM MensagemWorkflow mensagemWorkflow WHERE ";
    private static final String _SQL_COUNT_MENSAGEMWORKFLOW = "SELECT COUNT(mensagemWorkflow) FROM MensagemWorkflow mensagemWorkflow";
    private static final String _SQL_COUNT_MENSAGEMWORKFLOW_WHERE = "SELECT COUNT(mensagemWorkflow) FROM MensagemWorkflow mensagemWorkflow WHERE ";
    private static final String _ORDER_BY_ENTITY_ALIAS = "mensagemWorkflow.";
    private static final String _NO_SUCH_ENTITY_WITH_PRIMARY_KEY = "No MensagemWorkflow exists with the primary key ";
    private static final String _NO_SUCH_ENTITY_WITH_KEY = "No MensagemWorkflow exists with the key {";
    private static final boolean _HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE = GetterUtil.getBoolean(PropsUtil.get(
                PropsKeys.HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE));
    private static Log _log = LogFactoryUtil.getLog(MensagemWorkflowPersistenceImpl.class);
    private static Set<String> _badColumnNames = SetUtil.fromArray(new String[] {
                "uuid", "data"
            });
    private static MensagemWorkflow _nullMensagemWorkflow = new MensagemWorkflowImpl() {
            @Override
            public Object clone() {
                return this;
            }

            @Override
            public CacheModel<MensagemWorkflow> toCacheModel() {
                return _nullMensagemWorkflowCacheModel;
            }
        };

    private static CacheModel<MensagemWorkflow> _nullMensagemWorkflowCacheModel = new CacheModel<MensagemWorkflow>() {
            @Override
            public MensagemWorkflow toEntityModel() {
                return _nullMensagemWorkflow;
            }
        };

    public MensagemWorkflowPersistenceImpl() {
        setModelClass(MensagemWorkflow.class);
    }

    /**
     * Returns all the mensagem workflows where uuid = &#63;.
     *
     * @param uuid the uuid
     * @return the matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findByUuid(String uuid)
        throws SystemException {
        return findByUuid(uuid, QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
    }

    /**
     * Returns a range of all the mensagem workflows where uuid = &#63;.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param uuid the uuid
     * @param start the lower bound of the range of mensagem workflows
     * @param end the upper bound of the range of mensagem workflows (not inclusive)
     * @return the range of matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findByUuid(String uuid, int start, int end)
        throws SystemException {
        return findByUuid(uuid, start, end, null);
    }

    /**
     * Returns an ordered range of all the mensagem workflows where uuid = &#63;.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param uuid the uuid
     * @param start the lower bound of the range of mensagem workflows
     * @param end the upper bound of the range of mensagem workflows (not inclusive)
     * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
     * @return the ordered range of matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findByUuid(String uuid, int start, int end,
        OrderByComparator orderByComparator) throws SystemException {
        boolean pagination = true;
        FinderPath finderPath = null;
        Object[] finderArgs = null;

        if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
                (orderByComparator == null)) {
            pagination = false;
            finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID;
            finderArgs = new Object[] { uuid };
        } else {
            finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_UUID;
            finderArgs = new Object[] { uuid, start, end, orderByComparator };
        }

        List<MensagemWorkflow> list = (List<MensagemWorkflow>) FinderCacheUtil.getResult(finderPath,
                finderArgs, this);

        if ((list != null) && !list.isEmpty()) {
            for (MensagemWorkflow mensagemWorkflow : list) {
                if (!Validator.equals(uuid, mensagemWorkflow.getUuid())) {
                    list = null;

                    break;
                }
            }
        }

        if (list == null) {
            StringBundler query = null;

            if (orderByComparator != null) {
                query = new StringBundler(3 +
                        (orderByComparator.getOrderByFields().length * 3));
            } else {
                query = new StringBundler(3);
            }

            query.append(_SQL_SELECT_MENSAGEMWORKFLOW_WHERE);

            boolean bindUuid = false;

            if (uuid == null) {
                query.append(_FINDER_COLUMN_UUID_UUID_1);
            } else if (uuid.equals(StringPool.BLANK)) {
                query.append(_FINDER_COLUMN_UUID_UUID_3);
            } else {
                bindUuid = true;

                query.append(_FINDER_COLUMN_UUID_UUID_2);
            }

            if (orderByComparator != null) {
                appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
                    orderByComparator);
            } else
             if (pagination) {
                query.append(MensagemWorkflowModelImpl.ORDER_BY_JPQL);
            }

            String sql = query.toString();

            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(sql);

                QueryPos qPos = QueryPos.getInstance(q);

                if (bindUuid) {
                    qPos.add(uuid);
                }

                if (!pagination) {
                    list = (List<MensagemWorkflow>) QueryUtil.list(q,
                            getDialect(), start, end, false);

                    Collections.sort(list);

                    list = new UnmodifiableList<MensagemWorkflow>(list);
                } else {
                    list = (List<MensagemWorkflow>) QueryUtil.list(q,
                            getDialect(), start, end);
                }

                cacheResult(list);

                FinderCacheUtil.putResult(finderPath, finderArgs, list);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(finderPath, finderArgs);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return list;
    }

    /**
     * Returns the first mensagem workflow in the ordered set where uuid = &#63;.
     *
     * @param uuid the uuid
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the first matching mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow findByUuid_First(String uuid,
        OrderByComparator orderByComparator)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = fetchByUuid_First(uuid,
                orderByComparator);

        if (mensagemWorkflow != null) {
            return mensagemWorkflow;
        }

        StringBundler msg = new StringBundler(4);

        msg.append(_NO_SUCH_ENTITY_WITH_KEY);

        msg.append("uuid=");
        msg.append(uuid);

        msg.append(StringPool.CLOSE_CURLY_BRACE);

        throw new NoSuchMensagemWorkflowException(msg.toString());
    }

    /**
     * Returns the first mensagem workflow in the ordered set where uuid = &#63;.
     *
     * @param uuid the uuid
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the first matching mensagem workflow, or <code>null</code> if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow fetchByUuid_First(String uuid,
        OrderByComparator orderByComparator) throws SystemException {
        List<MensagemWorkflow> list = findByUuid(uuid, 0, 1, orderByComparator);

        if (!list.isEmpty()) {
            return list.get(0);
        }

        return null;
    }

    /**
     * Returns the last mensagem workflow in the ordered set where uuid = &#63;.
     *
     * @param uuid the uuid
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the last matching mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow findByUuid_Last(String uuid,
        OrderByComparator orderByComparator)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = fetchByUuid_Last(uuid,
                orderByComparator);

        if (mensagemWorkflow != null) {
            return mensagemWorkflow;
        }

        StringBundler msg = new StringBundler(4);

        msg.append(_NO_SUCH_ENTITY_WITH_KEY);

        msg.append("uuid=");
        msg.append(uuid);

        msg.append(StringPool.CLOSE_CURLY_BRACE);

        throw new NoSuchMensagemWorkflowException(msg.toString());
    }

    /**
     * Returns the last mensagem workflow in the ordered set where uuid = &#63;.
     *
     * @param uuid the uuid
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the last matching mensagem workflow, or <code>null</code> if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow fetchByUuid_Last(String uuid,
        OrderByComparator orderByComparator) throws SystemException {
        int count = countByUuid(uuid);

        if (count == 0) {
            return null;
        }

        List<MensagemWorkflow> list = findByUuid(uuid, count - 1, count,
                orderByComparator);

        if (!list.isEmpty()) {
            return list.get(0);
        }

        return null;
    }

    /**
     * Returns the mensagem workflows before and after the current mensagem workflow in the ordered set where uuid = &#63;.
     *
     * @param mensagemWorkflowId the primary key of the current mensagem workflow
     * @param uuid the uuid
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the previous, current, and next mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow[] findByUuid_PrevAndNext(long mensagemWorkflowId,
        String uuid, OrderByComparator orderByComparator)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = findByPrimaryKey(mensagemWorkflowId);

        Session session = null;

        try {
            session = openSession();

            MensagemWorkflow[] array = new MensagemWorkflowImpl[3];

            array[0] = getByUuid_PrevAndNext(session, mensagemWorkflow, uuid,
                    orderByComparator, true);

            array[1] = mensagemWorkflow;

            array[2] = getByUuid_PrevAndNext(session, mensagemWorkflow, uuid,
                    orderByComparator, false);

            return array;
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }
    }

    protected MensagemWorkflow getByUuid_PrevAndNext(Session session,
        MensagemWorkflow mensagemWorkflow, String uuid,
        OrderByComparator orderByComparator, boolean previous) {
        StringBundler query = null;

        if (orderByComparator != null) {
            query = new StringBundler(6 +
                    (orderByComparator.getOrderByFields().length * 6));
        } else {
            query = new StringBundler(3);
        }

        query.append(_SQL_SELECT_MENSAGEMWORKFLOW_WHERE);

        boolean bindUuid = false;

        if (uuid == null) {
            query.append(_FINDER_COLUMN_UUID_UUID_1);
        } else if (uuid.equals(StringPool.BLANK)) {
            query.append(_FINDER_COLUMN_UUID_UUID_3);
        } else {
            bindUuid = true;

            query.append(_FINDER_COLUMN_UUID_UUID_2);
        }

        if (orderByComparator != null) {
            String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();

            if (orderByConditionFields.length > 0) {
                query.append(WHERE_AND);
            }

            for (int i = 0; i < orderByConditionFields.length; i++) {
                query.append(_ORDER_BY_ENTITY_ALIAS);
                query.append(orderByConditionFields[i]);

                if ((i + 1) < orderByConditionFields.length) {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(WHERE_GREATER_THAN_HAS_NEXT);
                    } else {
                        query.append(WHERE_LESSER_THAN_HAS_NEXT);
                    }
                } else {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(WHERE_GREATER_THAN);
                    } else {
                        query.append(WHERE_LESSER_THAN);
                    }
                }
            }

            query.append(ORDER_BY_CLAUSE);

            String[] orderByFields = orderByComparator.getOrderByFields();

            for (int i = 0; i < orderByFields.length; i++) {
                query.append(_ORDER_BY_ENTITY_ALIAS);
                query.append(orderByFields[i]);

                if ((i + 1) < orderByFields.length) {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(ORDER_BY_ASC_HAS_NEXT);
                    } else {
                        query.append(ORDER_BY_DESC_HAS_NEXT);
                    }
                } else {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(ORDER_BY_ASC);
                    } else {
                        query.append(ORDER_BY_DESC);
                    }
                }
            }
        } else {
            query.append(MensagemWorkflowModelImpl.ORDER_BY_JPQL);
        }

        String sql = query.toString();

        Query q = session.createQuery(sql);

        q.setFirstResult(0);
        q.setMaxResults(2);

        QueryPos qPos = QueryPos.getInstance(q);

        if (bindUuid) {
            qPos.add(uuid);
        }

        if (orderByComparator != null) {
            Object[] values = orderByComparator.getOrderByConditionValues(mensagemWorkflow);

            for (Object value : values) {
                qPos.add(value);
            }
        }

        List<MensagemWorkflow> list = q.list();

        if (list.size() == 2) {
            return list.get(1);
        } else {
            return null;
        }
    }

    /**
     * Removes all the mensagem workflows where uuid = &#63; from the database.
     *
     * @param uuid the uuid
     * @throws SystemException if a system exception occurred
     */
    @Override
    public void removeByUuid(String uuid) throws SystemException {
        for (MensagemWorkflow mensagemWorkflow : findByUuid(uuid,
                QueryUtil.ALL_POS, QueryUtil.ALL_POS, null)) {
            remove(mensagemWorkflow);
        }
    }

    /**
     * Returns the number of mensagem workflows where uuid = &#63;.
     *
     * @param uuid the uuid
     * @return the number of matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public int countByUuid(String uuid) throws SystemException {
        FinderPath finderPath = FINDER_PATH_COUNT_BY_UUID;

        Object[] finderArgs = new Object[] { uuid };

        Long count = (Long) FinderCacheUtil.getResult(finderPath, finderArgs,
                this);

        if (count == null) {
            StringBundler query = new StringBundler(2);

            query.append(_SQL_COUNT_MENSAGEMWORKFLOW_WHERE);

            boolean bindUuid = false;

            if (uuid == null) {
                query.append(_FINDER_COLUMN_UUID_UUID_1);
            } else if (uuid.equals(StringPool.BLANK)) {
                query.append(_FINDER_COLUMN_UUID_UUID_3);
            } else {
                bindUuid = true;

                query.append(_FINDER_COLUMN_UUID_UUID_2);
            }

            String sql = query.toString();

            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(sql);

                QueryPos qPos = QueryPos.getInstance(q);

                if (bindUuid) {
                    qPos.add(uuid);
                }

                count = (Long) q.uniqueResult();

                FinderCacheUtil.putResult(finderPath, finderArgs, count);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(finderPath, finderArgs);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return count.intValue();
    }

    /**
     * Returns all the mensagem workflows where mensagemId = &#63;.
     *
     * @param mensagemId the mensagem ID
     * @return the matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findByMensagemId(long mensagemId)
        throws SystemException {
        return findByMensagemId(mensagemId, QueryUtil.ALL_POS,
            QueryUtil.ALL_POS, null);
    }

    /**
     * Returns a range of all the mensagem workflows where mensagemId = &#63;.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param mensagemId the mensagem ID
     * @param start the lower bound of the range of mensagem workflows
     * @param end the upper bound of the range of mensagem workflows (not inclusive)
     * @return the range of matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findByMensagemId(long mensagemId, int start,
        int end) throws SystemException {
        return findByMensagemId(mensagemId, start, end, null);
    }

    /**
     * Returns an ordered range of all the mensagem workflows where mensagemId = &#63;.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param mensagemId the mensagem ID
     * @param start the lower bound of the range of mensagem workflows
     * @param end the upper bound of the range of mensagem workflows (not inclusive)
     * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
     * @return the ordered range of matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findByMensagemId(long mensagemId, int start,
        int end, OrderByComparator orderByComparator) throws SystemException {
        boolean pagination = true;
        FinderPath finderPath = null;
        Object[] finderArgs = null;

        if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
                (orderByComparator == null)) {
            pagination = false;
            finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_MENSAGEMID;
            finderArgs = new Object[] { mensagemId };
        } else {
            finderPath = FINDER_PATH_WITH_PAGINATION_FIND_BY_MENSAGEMID;
            finderArgs = new Object[] { mensagemId, start, end, orderByComparator };
        }

        List<MensagemWorkflow> list = (List<MensagemWorkflow>) FinderCacheUtil.getResult(finderPath,
                finderArgs, this);

        if ((list != null) && !list.isEmpty()) {
            for (MensagemWorkflow mensagemWorkflow : list) {
                if ((mensagemId != mensagemWorkflow.getMensagemId())) {
                    list = null;

                    break;
                }
            }
        }

        if (list == null) {
            StringBundler query = null;

            if (orderByComparator != null) {
                query = new StringBundler(3 +
                        (orderByComparator.getOrderByFields().length * 3));
            } else {
                query = new StringBundler(3);
            }

            query.append(_SQL_SELECT_MENSAGEMWORKFLOW_WHERE);

            query.append(_FINDER_COLUMN_MENSAGEMID_MENSAGEMID_2);

            if (orderByComparator != null) {
                appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
                    orderByComparator);
            } else
             if (pagination) {
                query.append(MensagemWorkflowModelImpl.ORDER_BY_JPQL);
            }

            String sql = query.toString();

            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(sql);

                QueryPos qPos = QueryPos.getInstance(q);

                qPos.add(mensagemId);

                if (!pagination) {
                    list = (List<MensagemWorkflow>) QueryUtil.list(q,
                            getDialect(), start, end, false);

                    Collections.sort(list);

                    list = new UnmodifiableList<MensagemWorkflow>(list);
                } else {
                    list = (List<MensagemWorkflow>) QueryUtil.list(q,
                            getDialect(), start, end);
                }

                cacheResult(list);

                FinderCacheUtil.putResult(finderPath, finderArgs, list);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(finderPath, finderArgs);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return list;
    }

    /**
     * Returns the first mensagem workflow in the ordered set where mensagemId = &#63;.
     *
     * @param mensagemId the mensagem ID
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the first matching mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow findByMensagemId_First(long mensagemId,
        OrderByComparator orderByComparator)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = fetchByMensagemId_First(mensagemId,
                orderByComparator);

        if (mensagemWorkflow != null) {
            return mensagemWorkflow;
        }

        StringBundler msg = new StringBundler(4);

        msg.append(_NO_SUCH_ENTITY_WITH_KEY);

        msg.append("mensagemId=");
        msg.append(mensagemId);

        msg.append(StringPool.CLOSE_CURLY_BRACE);

        throw new NoSuchMensagemWorkflowException(msg.toString());
    }

    /**
     * Returns the first mensagem workflow in the ordered set where mensagemId = &#63;.
     *
     * @param mensagemId the mensagem ID
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the first matching mensagem workflow, or <code>null</code> if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow fetchByMensagemId_First(long mensagemId,
        OrderByComparator orderByComparator) throws SystemException {
        List<MensagemWorkflow> list = findByMensagemId(mensagemId, 0, 1,
                orderByComparator);

        if (!list.isEmpty()) {
            return list.get(0);
        }

        return null;
    }

    /**
     * Returns the last mensagem workflow in the ordered set where mensagemId = &#63;.
     *
     * @param mensagemId the mensagem ID
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the last matching mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow findByMensagemId_Last(long mensagemId,
        OrderByComparator orderByComparator)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = fetchByMensagemId_Last(mensagemId,
                orderByComparator);

        if (mensagemWorkflow != null) {
            return mensagemWorkflow;
        }

        StringBundler msg = new StringBundler(4);

        msg.append(_NO_SUCH_ENTITY_WITH_KEY);

        msg.append("mensagemId=");
        msg.append(mensagemId);

        msg.append(StringPool.CLOSE_CURLY_BRACE);

        throw new NoSuchMensagemWorkflowException(msg.toString());
    }

    /**
     * Returns the last mensagem workflow in the ordered set where mensagemId = &#63;.
     *
     * @param mensagemId the mensagem ID
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the last matching mensagem workflow, or <code>null</code> if a matching mensagem workflow could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow fetchByMensagemId_Last(long mensagemId,
        OrderByComparator orderByComparator) throws SystemException {
        int count = countByMensagemId(mensagemId);

        if (count == 0) {
            return null;
        }

        List<MensagemWorkflow> list = findByMensagemId(mensagemId, count - 1,
                count, orderByComparator);

        if (!list.isEmpty()) {
            return list.get(0);
        }

        return null;
    }

    /**
     * Returns the mensagem workflows before and after the current mensagem workflow in the ordered set where mensagemId = &#63;.
     *
     * @param mensagemWorkflowId the primary key of the current mensagem workflow
     * @param mensagemId the mensagem ID
     * @param orderByComparator the comparator to order the set by (optionally <code>null</code>)
     * @return the previous, current, and next mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow[] findByMensagemId_PrevAndNext(
        long mensagemWorkflowId, long mensagemId,
        OrderByComparator orderByComparator)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = findByPrimaryKey(mensagemWorkflowId);

        Session session = null;

        try {
            session = openSession();

            MensagemWorkflow[] array = new MensagemWorkflowImpl[3];

            array[0] = getByMensagemId_PrevAndNext(session, mensagemWorkflow,
                    mensagemId, orderByComparator, true);

            array[1] = mensagemWorkflow;

            array[2] = getByMensagemId_PrevAndNext(session, mensagemWorkflow,
                    mensagemId, orderByComparator, false);

            return array;
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }
    }

    protected MensagemWorkflow getByMensagemId_PrevAndNext(Session session,
        MensagemWorkflow mensagemWorkflow, long mensagemId,
        OrderByComparator orderByComparator, boolean previous) {
        StringBundler query = null;

        if (orderByComparator != null) {
            query = new StringBundler(6 +
                    (orderByComparator.getOrderByFields().length * 6));
        } else {
            query = new StringBundler(3);
        }

        query.append(_SQL_SELECT_MENSAGEMWORKFLOW_WHERE);

        query.append(_FINDER_COLUMN_MENSAGEMID_MENSAGEMID_2);

        if (orderByComparator != null) {
            String[] orderByConditionFields = orderByComparator.getOrderByConditionFields();

            if (orderByConditionFields.length > 0) {
                query.append(WHERE_AND);
            }

            for (int i = 0; i < orderByConditionFields.length; i++) {
                query.append(_ORDER_BY_ENTITY_ALIAS);
                query.append(orderByConditionFields[i]);

                if ((i + 1) < orderByConditionFields.length) {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(WHERE_GREATER_THAN_HAS_NEXT);
                    } else {
                        query.append(WHERE_LESSER_THAN_HAS_NEXT);
                    }
                } else {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(WHERE_GREATER_THAN);
                    } else {
                        query.append(WHERE_LESSER_THAN);
                    }
                }
            }

            query.append(ORDER_BY_CLAUSE);

            String[] orderByFields = orderByComparator.getOrderByFields();

            for (int i = 0; i < orderByFields.length; i++) {
                query.append(_ORDER_BY_ENTITY_ALIAS);
                query.append(orderByFields[i]);

                if ((i + 1) < orderByFields.length) {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(ORDER_BY_ASC_HAS_NEXT);
                    } else {
                        query.append(ORDER_BY_DESC_HAS_NEXT);
                    }
                } else {
                    if (orderByComparator.isAscending() ^ previous) {
                        query.append(ORDER_BY_ASC);
                    } else {
                        query.append(ORDER_BY_DESC);
                    }
                }
            }
        } else {
            query.append(MensagemWorkflowModelImpl.ORDER_BY_JPQL);
        }

        String sql = query.toString();

        Query q = session.createQuery(sql);

        q.setFirstResult(0);
        q.setMaxResults(2);

        QueryPos qPos = QueryPos.getInstance(q);

        qPos.add(mensagemId);

        if (orderByComparator != null) {
            Object[] values = orderByComparator.getOrderByConditionValues(mensagemWorkflow);

            for (Object value : values) {
                qPos.add(value);
            }
        }

        List<MensagemWorkflow> list = q.list();

        if (list.size() == 2) {
            return list.get(1);
        } else {
            return null;
        }
    }

    /**
     * Removes all the mensagem workflows where mensagemId = &#63; from the database.
     *
     * @param mensagemId the mensagem ID
     * @throws SystemException if a system exception occurred
     */
    @Override
    public void removeByMensagemId(long mensagemId) throws SystemException {
        for (MensagemWorkflow mensagemWorkflow : findByMensagemId(mensagemId,
                QueryUtil.ALL_POS, QueryUtil.ALL_POS, null)) {
            remove(mensagemWorkflow);
        }
    }

    /**
     * Returns the number of mensagem workflows where mensagemId = &#63;.
     *
     * @param mensagemId the mensagem ID
     * @return the number of matching mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public int countByMensagemId(long mensagemId) throws SystemException {
        FinderPath finderPath = FINDER_PATH_COUNT_BY_MENSAGEMID;

        Object[] finderArgs = new Object[] { mensagemId };

        Long count = (Long) FinderCacheUtil.getResult(finderPath, finderArgs,
                this);

        if (count == null) {
            StringBundler query = new StringBundler(2);

            query.append(_SQL_COUNT_MENSAGEMWORKFLOW_WHERE);

            query.append(_FINDER_COLUMN_MENSAGEMID_MENSAGEMID_2);

            String sql = query.toString();

            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(sql);

                QueryPos qPos = QueryPos.getInstance(q);

                qPos.add(mensagemId);

                count = (Long) q.uniqueResult();

                FinderCacheUtil.putResult(finderPath, finderArgs, count);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(finderPath, finderArgs);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return count.intValue();
    }

    /**
     * Caches the mensagem workflow in the entity cache if it is enabled.
     *
     * @param mensagemWorkflow the mensagem workflow
     */
    @Override
    public void cacheResult(MensagemWorkflow mensagemWorkflow) {
        EntityCacheUtil.putResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowImpl.class, mensagemWorkflow.getPrimaryKey(),
            mensagemWorkflow);

        mensagemWorkflow.resetOriginalValues();
    }

    /**
     * Caches the mensagem workflows in the entity cache if it is enabled.
     *
     * @param mensagemWorkflows the mensagem workflows
     */
    @Override
    public void cacheResult(List<MensagemWorkflow> mensagemWorkflows) {
        for (MensagemWorkflow mensagemWorkflow : mensagemWorkflows) {
            if (EntityCacheUtil.getResult(
                        MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
                        MensagemWorkflowImpl.class,
                        mensagemWorkflow.getPrimaryKey()) == null) {
                cacheResult(mensagemWorkflow);
            } else {
                mensagemWorkflow.resetOriginalValues();
            }
        }
    }

    /**
     * Clears the cache for all mensagem workflows.
     *
     * <p>
     * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
     * </p>
     */
    @Override
    public void clearCache() {
        if (_HIBERNATE_CACHE_USE_SECOND_LEVEL_CACHE) {
            CacheRegistryUtil.clear(MensagemWorkflowImpl.class.getName());
        }

        EntityCacheUtil.clearCache(MensagemWorkflowImpl.class.getName());

        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_ENTITY);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
    }

    /**
     * Clears the cache for the mensagem workflow.
     *
     * <p>
     * The {@link com.liferay.portal.kernel.dao.orm.EntityCache} and {@link com.liferay.portal.kernel.dao.orm.FinderCache} are both cleared by this method.
     * </p>
     */
    @Override
    public void clearCache(MensagemWorkflow mensagemWorkflow) {
        EntityCacheUtil.removeResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowImpl.class, mensagemWorkflow.getPrimaryKey());

        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
    }

    @Override
    public void clearCache(List<MensagemWorkflow> mensagemWorkflows) {
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);

        for (MensagemWorkflow mensagemWorkflow : mensagemWorkflows) {
            EntityCacheUtil.removeResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
                MensagemWorkflowImpl.class, mensagemWorkflow.getPrimaryKey());
        }
    }

    /**
     * Creates a new mensagem workflow with the primary key. Does not add the mensagem workflow to the database.
     *
     * @param mensagemWorkflowId the primary key for the new mensagem workflow
     * @return the new mensagem workflow
     */
    @Override
    public MensagemWorkflow create(long mensagemWorkflowId) {
        MensagemWorkflow mensagemWorkflow = new MensagemWorkflowImpl();

        mensagemWorkflow.setNew(true);
        mensagemWorkflow.setPrimaryKey(mensagemWorkflowId);

        String uuid = PortalUUIDUtil.generate();

        mensagemWorkflow.setUuid(uuid);

        return mensagemWorkflow;
    }

    /**
     * Removes the mensagem workflow with the primary key from the database. Also notifies the appropriate model listeners.
     *
     * @param mensagemWorkflowId the primary key of the mensagem workflow
     * @return the mensagem workflow that was removed
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow remove(long mensagemWorkflowId)
        throws NoSuchMensagemWorkflowException, SystemException {
        return remove((Serializable) mensagemWorkflowId);
    }

    /**
     * Removes the mensagem workflow with the primary key from the database. Also notifies the appropriate model listeners.
     *
     * @param primaryKey the primary key of the mensagem workflow
     * @return the mensagem workflow that was removed
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow remove(Serializable primaryKey)
        throws NoSuchMensagemWorkflowException, SystemException {
        Session session = null;

        try {
            session = openSession();

            MensagemWorkflow mensagemWorkflow = (MensagemWorkflow) session.get(MensagemWorkflowImpl.class,
                    primaryKey);

            if (mensagemWorkflow == null) {
                if (_log.isWarnEnabled()) {
                    _log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
                }

                throw new NoSuchMensagemWorkflowException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
                    primaryKey);
            }

            return remove(mensagemWorkflow);
        } catch (NoSuchMensagemWorkflowException nsee) {
            throw nsee;
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }
    }

    @Override
    protected MensagemWorkflow removeImpl(MensagemWorkflow mensagemWorkflow)
        throws SystemException {
        mensagemWorkflow = toUnwrappedModel(mensagemWorkflow);

        Session session = null;

        try {
            session = openSession();

            if (!session.contains(mensagemWorkflow)) {
                mensagemWorkflow = (MensagemWorkflow) session.get(MensagemWorkflowImpl.class,
                        mensagemWorkflow.getPrimaryKeyObj());
            }

            if (mensagemWorkflow != null) {
                session.delete(mensagemWorkflow);
            }
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }

        if (mensagemWorkflow != null) {
            clearCache(mensagemWorkflow);
        }

        return mensagemWorkflow;
    }

    @Override
    public MensagemWorkflow updateImpl(
        br.mp.mprj.portal.portlet.gestaomensagens.service.model.MensagemWorkflow mensagemWorkflow)
        throws SystemException {
        mensagemWorkflow = toUnwrappedModel(mensagemWorkflow);

        boolean isNew = mensagemWorkflow.isNew();

        MensagemWorkflowModelImpl mensagemWorkflowModelImpl = (MensagemWorkflowModelImpl) mensagemWorkflow;

        if (Validator.isNull(mensagemWorkflow.getUuid())) {
            String uuid = PortalUUIDUtil.generate();

            mensagemWorkflow.setUuid(uuid);
        }

        Session session = null;

        try {
            session = openSession();

            if (mensagemWorkflow.isNew()) {
                session.save(mensagemWorkflow);

                mensagemWorkflow.setNew(false);
            } else {
                session.merge(mensagemWorkflow);
            }
        } catch (Exception e) {
            throw processException(e);
        } finally {
            closeSession(session);
        }

        FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);

        if (isNew || !MensagemWorkflowModelImpl.COLUMN_BITMASK_ENABLED) {
            FinderCacheUtil.clearCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
        }
        else {
            if ((mensagemWorkflowModelImpl.getColumnBitmask() &
                    FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID.getColumnBitmask()) != 0) {
                Object[] args = new Object[] {
                        mensagemWorkflowModelImpl.getOriginalUuid()
                    };

                FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
                FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
                    args);

                args = new Object[] { mensagemWorkflowModelImpl.getUuid() };

                FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_UUID, args);
                FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_UUID,
                    args);
            }

            if ((mensagemWorkflowModelImpl.getColumnBitmask() &
                    FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_MENSAGEMID.getColumnBitmask()) != 0) {
                Object[] args = new Object[] {
                        mensagemWorkflowModelImpl.getOriginalMensagemId()
                    };

                FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_MENSAGEMID,
                    args);
                FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_MENSAGEMID,
                    args);

                args = new Object[] { mensagemWorkflowModelImpl.getMensagemId() };

                FinderCacheUtil.removeResult(FINDER_PATH_COUNT_BY_MENSAGEMID,
                    args);
                FinderCacheUtil.removeResult(FINDER_PATH_WITHOUT_PAGINATION_FIND_BY_MENSAGEMID,
                    args);
            }
        }

        EntityCacheUtil.putResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
            MensagemWorkflowImpl.class, mensagemWorkflow.getPrimaryKey(),
            mensagemWorkflow);

        return mensagemWorkflow;
    }

    protected MensagemWorkflow toUnwrappedModel(
        MensagemWorkflow mensagemWorkflow) {
        if (mensagemWorkflow instanceof MensagemWorkflowImpl) {
            return mensagemWorkflow;
        }

        MensagemWorkflowImpl mensagemWorkflowImpl = new MensagemWorkflowImpl();

        mensagemWorkflowImpl.setNew(mensagemWorkflow.isNew());
        mensagemWorkflowImpl.setPrimaryKey(mensagemWorkflow.getPrimaryKey());

        mensagemWorkflowImpl.setUuid(mensagemWorkflow.getUuid());
        mensagemWorkflowImpl.setMensagemWorkflowId(mensagemWorkflow.getMensagemWorkflowId());
        mensagemWorkflowImpl.setMensagemId(mensagemWorkflow.getMensagemId());
        mensagemWorkflowImpl.setUserId(mensagemWorkflow.getUserId());
        mensagemWorkflowImpl.setStatus(mensagemWorkflow.getStatus());
        mensagemWorkflowImpl.setData(mensagemWorkflow.getData());
        mensagemWorkflowImpl.setComentario(mensagemWorkflow.getComentario());

        return mensagemWorkflowImpl;
    }

    /**
     * Returns the mensagem workflow with the primary key or throws a {@link com.liferay.portal.NoSuchModelException} if it could not be found.
     *
     * @param primaryKey the primary key of the mensagem workflow
     * @return the mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow findByPrimaryKey(Serializable primaryKey)
        throws NoSuchMensagemWorkflowException, SystemException {
        MensagemWorkflow mensagemWorkflow = fetchByPrimaryKey(primaryKey);

        if (mensagemWorkflow == null) {
            if (_log.isWarnEnabled()) {
                _log.warn(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY + primaryKey);
            }

            throw new NoSuchMensagemWorkflowException(_NO_SUCH_ENTITY_WITH_PRIMARY_KEY +
                primaryKey);
        }

        return mensagemWorkflow;
    }

    /**
     * Returns the mensagem workflow with the primary key or throws a {@link br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException} if it could not be found.
     *
     * @param mensagemWorkflowId the primary key of the mensagem workflow
     * @return the mensagem workflow
     * @throws br.mp.mprj.portal.portlet.gestaomensagens.service.NoSuchMensagemWorkflowException if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow findByPrimaryKey(long mensagemWorkflowId)
        throws NoSuchMensagemWorkflowException, SystemException {
        return findByPrimaryKey((Serializable) mensagemWorkflowId);
    }

    /**
     * Returns the mensagem workflow with the primary key or returns <code>null</code> if it could not be found.
     *
     * @param primaryKey the primary key of the mensagem workflow
     * @return the mensagem workflow, or <code>null</code> if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow fetchByPrimaryKey(Serializable primaryKey)
        throws SystemException {
        MensagemWorkflow mensagemWorkflow = (MensagemWorkflow) EntityCacheUtil.getResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
                MensagemWorkflowImpl.class, primaryKey);

        if (mensagemWorkflow == _nullMensagemWorkflow) {
            return null;
        }

        if (mensagemWorkflow == null) {
            Session session = null;

            try {
                session = openSession();

                mensagemWorkflow = (MensagemWorkflow) session.get(MensagemWorkflowImpl.class,
                        primaryKey);

                if (mensagemWorkflow != null) {
                    cacheResult(mensagemWorkflow);
                } else {
                    EntityCacheUtil.putResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
                        MensagemWorkflowImpl.class, primaryKey,
                        _nullMensagemWorkflow);
                }
            } catch (Exception e) {
                EntityCacheUtil.removeResult(MensagemWorkflowModelImpl.ENTITY_CACHE_ENABLED,
                    MensagemWorkflowImpl.class, primaryKey);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return mensagemWorkflow;
    }

    /**
     * Returns the mensagem workflow with the primary key or returns <code>null</code> if it could not be found.
     *
     * @param mensagemWorkflowId the primary key of the mensagem workflow
     * @return the mensagem workflow, or <code>null</code> if a mensagem workflow with the primary key could not be found
     * @throws SystemException if a system exception occurred
     */
    @Override
    public MensagemWorkflow fetchByPrimaryKey(long mensagemWorkflowId)
        throws SystemException {
        return fetchByPrimaryKey((Serializable) mensagemWorkflowId);
    }

    /**
     * Returns all the mensagem workflows.
     *
     * @return the mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findAll() throws SystemException {
        return findAll(QueryUtil.ALL_POS, QueryUtil.ALL_POS, null);
    }

    /**
     * Returns a range of all the mensagem workflows.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param start the lower bound of the range of mensagem workflows
     * @param end the upper bound of the range of mensagem workflows (not inclusive)
     * @return the range of mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findAll(int start, int end)
        throws SystemException {
        return findAll(start, end, null);
    }

    /**
     * Returns an ordered range of all the mensagem workflows.
     *
     * <p>
     * Useful when paginating results. Returns a maximum of <code>end - start</code> instances. <code>start</code> and <code>end</code> are not primary keys, they are indexes in the result set. Thus, <code>0</code> refers to the first result in the set. Setting both <code>start</code> and <code>end</code> to {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS} will return the full result set. If <code>orderByComparator</code> is specified, then the query will include the given ORDER BY logic. If <code>orderByComparator</code> is absent and pagination is required (<code>start</code> and <code>end</code> are not {@link com.liferay.portal.kernel.dao.orm.QueryUtil#ALL_POS}), then the query will include the default ORDER BY logic from {@link br.mp.mprj.portal.portlet.gestaomensagens.service.model.impl.MensagemWorkflowModelImpl}. If both <code>orderByComparator</code> and pagination are absent, for performance reasons, the query will not have an ORDER BY clause and the returned result set will be sorted on by the primary key in an ascending order.
     * </p>
     *
     * @param start the lower bound of the range of mensagem workflows
     * @param end the upper bound of the range of mensagem workflows (not inclusive)
     * @param orderByComparator the comparator to order the results by (optionally <code>null</code>)
     * @return the ordered range of mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public List<MensagemWorkflow> findAll(int start, int end,
        OrderByComparator orderByComparator) throws SystemException {
        boolean pagination = true;
        FinderPath finderPath = null;
        Object[] finderArgs = null;

        if ((start == QueryUtil.ALL_POS) && (end == QueryUtil.ALL_POS) &&
                (orderByComparator == null)) {
            pagination = false;
            finderPath = FINDER_PATH_WITHOUT_PAGINATION_FIND_ALL;
            finderArgs = FINDER_ARGS_EMPTY;
        } else {
            finderPath = FINDER_PATH_WITH_PAGINATION_FIND_ALL;
            finderArgs = new Object[] { start, end, orderByComparator };
        }

        List<MensagemWorkflow> list = (List<MensagemWorkflow>) FinderCacheUtil.getResult(finderPath,
                finderArgs, this);

        if (list == null) {
            StringBundler query = null;
            String sql = null;

            if (orderByComparator != null) {
                query = new StringBundler(2 +
                        (orderByComparator.getOrderByFields().length * 3));

                query.append(_SQL_SELECT_MENSAGEMWORKFLOW);

                appendOrderByComparator(query, _ORDER_BY_ENTITY_ALIAS,
                    orderByComparator);

                sql = query.toString();
            } else {
                sql = _SQL_SELECT_MENSAGEMWORKFLOW;

                if (pagination) {
                    sql = sql.concat(MensagemWorkflowModelImpl.ORDER_BY_JPQL);
                }
            }

            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(sql);

                if (!pagination) {
                    list = (List<MensagemWorkflow>) QueryUtil.list(q,
                            getDialect(), start, end, false);

                    Collections.sort(list);

                    list = new UnmodifiableList<MensagemWorkflow>(list);
                } else {
                    list = (List<MensagemWorkflow>) QueryUtil.list(q,
                            getDialect(), start, end);
                }

                cacheResult(list);

                FinderCacheUtil.putResult(finderPath, finderArgs, list);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(finderPath, finderArgs);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return list;
    }

    /**
     * Removes all the mensagem workflows from the database.
     *
     * @throws SystemException if a system exception occurred
     */
    @Override
    public void removeAll() throws SystemException {
        for (MensagemWorkflow mensagemWorkflow : findAll()) {
            remove(mensagemWorkflow);
        }
    }

    /**
     * Returns the number of mensagem workflows.
     *
     * @return the number of mensagem workflows
     * @throws SystemException if a system exception occurred
     */
    @Override
    public int countAll() throws SystemException {
        Long count = (Long) FinderCacheUtil.getResult(FINDER_PATH_COUNT_ALL,
                FINDER_ARGS_EMPTY, this);

        if (count == null) {
            Session session = null;

            try {
                session = openSession();

                Query q = session.createQuery(_SQL_COUNT_MENSAGEMWORKFLOW);

                count = (Long) q.uniqueResult();

                FinderCacheUtil.putResult(FINDER_PATH_COUNT_ALL,
                    FINDER_ARGS_EMPTY, count);
            } catch (Exception e) {
                FinderCacheUtil.removeResult(FINDER_PATH_COUNT_ALL,
                    FINDER_ARGS_EMPTY);

                throw processException(e);
            } finally {
                closeSession(session);
            }
        }

        return count.intValue();
    }

    @Override
    protected Set<String> getBadColumnNames() {
        return _badColumnNames;
    }

    /**
     * Initializes the mensagem workflow persistence.
     */
    public void afterPropertiesSet() {
        String[] listenerClassNames = StringUtil.split(GetterUtil.getString(
                    com.liferay.util.service.ServiceProps.get(
                        "value.object.listener.br.mp.mprj.portal.portlet.gestaomensagens.service.model.MensagemWorkflow")));

        if (listenerClassNames.length > 0) {
            try {
                List<ModelListener<MensagemWorkflow>> listenersList = new ArrayList<ModelListener<MensagemWorkflow>>();

                for (String listenerClassName : listenerClassNames) {
                    listenersList.add((ModelListener<MensagemWorkflow>) InstanceFactory.newInstance(
                            getClassLoader(), listenerClassName));
                }

                listeners = listenersList.toArray(new ModelListener[listenersList.size()]);
            } catch (Exception e) {
                _log.error(e);
            }
        }
    }

    public void destroy() {
        EntityCacheUtil.removeCache(MensagemWorkflowImpl.class.getName());
        FinderCacheUtil.removeCache(FINDER_CLASS_NAME_ENTITY);
        FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITH_PAGINATION);
        FinderCacheUtil.removeCache(FINDER_CLASS_NAME_LIST_WITHOUT_PAGINATION);
    }
}
