org.hibernate.criterion.DetachedCriteria.java Source code

Java tutorial

Introduction

Here is the source code for org.hibernate.criterion.DetachedCriteria.java

Source

/*
 * Hibernate, Relational Persistence for Idiomatic Java
 *
 * License: GNU Lesser General Public License (LGPL), version 2.1 or later.
 * See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
 */
package org.hibernate.criterion;

import java.io.Serializable;

import org.hibernate.Criteria;
import org.hibernate.FetchMode;
import org.hibernate.LockMode;
import org.hibernate.Session;
import org.hibernate.engine.spi.SessionImplementor;
import org.hibernate.internal.CriteriaImpl;
import org.hibernate.sql.JoinType;
import org.hibernate.transform.ResultTransformer;

/**
 * Models a detached form of a Criteria (not associated with a Session).
 *
 * Some applications need to create criteria queries in "detached mode", where the Hibernate Session is
 * not available.  Applications would create a DetachableCriteria to describe the query, and then later
 * associated it with a Session to obtain the "executable" Criteria:
 * <code>
 *     DetachedCriteria detached = new DetachedCriteria();
 *     ...
 *     Criteria criteria = detached.getExecutableCriteria( session );
 *     ...
 *     criteria.list();
 * </code>
 *
 * All methods have the same semantics and behavior as the corresponding methods of the Criteria interface.
 *
 * @author Gavin King
 *
 * @see org.hibernate.Criteria
 */
public class DetachedCriteria implements CriteriaSpecification, Serializable {
    private final CriteriaImpl impl;
    private final Criteria criteria;

    protected DetachedCriteria(String entityName) {
        impl = new CriteriaImpl(entityName, null);
        criteria = impl;
    }

    protected DetachedCriteria(String entityName, String alias) {
        impl = new CriteriaImpl(entityName, alias, null);
        criteria = impl;
    }

    protected DetachedCriteria(CriteriaImpl impl, Criteria criteria) {
        this.impl = impl;
        this.criteria = criteria;
    }

    /**
     * Get an executable instance of Criteria to actually run the query.
     *
     * @param session The session to associate the built Criteria with
     *
     * @return The "executable" Criteria
     */
    public Criteria getExecutableCriteria(Session session) {
        impl.setSession((SessionImplementor) session);
        return impl;
    }

    /**
     * Obtain the alias associated with this DetachedCriteria
     *
     * @return The alias
     */
    public String getAlias() {
        return criteria.getAlias();
    }

    /**
     * Retrieve the CriteriaImpl used internally to hold the DetachedCriteria state
     *
     * @return The internally maintained CriteriaImpl
     */
    CriteriaImpl getCriteriaImpl() {
        return impl;
    }

    /**
     * Static builder to create a DetachedCriteria for the given entity.
     *
     * @param entityName The name of the entity to create a DetachedCriteria for
     *
     * @return The DetachedCriteria
     */
    @SuppressWarnings("UnusedDeclaration")
    public static DetachedCriteria forEntityName(String entityName) {
        return new DetachedCriteria(entityName);
    }

    /**
     * Static builder to create a DetachedCriteria for the given entity.
     *
     * @param entityName The name of the entity to create a DetachedCriteria for
     * @param alias The alias to apply to the entity
     *
     * @return The DetachedCriteria
     */
    @SuppressWarnings("UnusedDeclaration")
    public static DetachedCriteria forEntityName(String entityName, String alias) {
        return new DetachedCriteria(entityName, alias);
    }

    /**
     * Static builder to create a DetachedCriteria for the given entity, by its Class.
     *
     * @param clazz The entity class
     *
     * @return The DetachedCriteria
     */
    public static DetachedCriteria forClass(Class clazz) {
        return new DetachedCriteria(clazz.getName());
    }

    /**
     * Static builder to create a DetachedCriteria for the given entity, by its Class.
     *
     * @param clazz The entity class
     * @param alias The alias to apply to the entity
     *
     * @return The DetachedCriteria
     */
    public static DetachedCriteria forClass(Class clazz, String alias) {
        return new DetachedCriteria(clazz.getName(), alias);
    }

    /**
     * Add a restriction
     *
     * @param criterion The restriction
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria add(Criterion criterion) {
        criteria.add(criterion);
        return this;
    }

    /**
     * Adds an ordering
     *
     * @param order The ordering
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria addOrder(Order order) {
        criteria.addOrder(order);
        return this;
    }

    /**
     * Set the fetch mode for a given association
     *
     * @param associationPath The association path
     * @param mode The fetch mode to apply
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria setFetchMode(String associationPath, FetchMode mode) {
        criteria.setFetchMode(associationPath, mode);
        return this;
    }

    /**
     * Set the projection to use.
     *
     * @param projection The projection to use
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria setProjection(Projection projection) {
        criteria.setProjection(projection);
        return this;
    }

    /**
     * Set the result transformer to use.
     *
     * @param resultTransformer The result transformer to use
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria setResultTransformer(ResultTransformer resultTransformer) {
        criteria.setResultTransformer(resultTransformer);
        return this;
    }

    /**
     * Creates an association path alias within this DetachedCriteria.  The alias can then be used in further
     * alias creations or restrictions, etc.
     *
     * @param associationPath The association path
     * @param alias The alias to apply to that association path
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria createAlias(String associationPath, String alias) {
        criteria.createAlias(associationPath, alias);
        return this;
    }

    /**
     * Creates an association path alias within this DetachedCriteria specifying the type of join.  The alias
     * can then be used in further alias creations or restrictions, etc.
     *
     * @param associationPath The association path
     * @param alias The alias to apply to that association path
     * @param joinType The type of join to use
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria createAlias(String associationPath, String alias, JoinType joinType) {
        criteria.createAlias(associationPath, alias, joinType);
        return this;
    }

    /**
     * Creates an association path alias within this DetachedCriteria specifying the type of join.  The alias
     * can then be used in further alias creations or restrictions, etc.
     *
     * @param associationPath The association path
     * @param alias The alias to apply to that association path
     * @param joinType The type of join to use
     * @param withClause An additional restriction on the join
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria createAlias(String associationPath, String alias, JoinType joinType,
            Criterion withClause) {
        criteria.createAlias(associationPath, alias, joinType, withClause);
        return this;
    }

    /**
     * Deprecated!
     *
     * @param associationPath The association path
     * @param alias The alias to apply to that association path
     * @param joinType The type of join to use
     *
     * @return {@code this}, for method chaining
     *
     * @deprecated use {@link #createAlias(String, String, JoinType)}
     */
    @Deprecated
    public DetachedCriteria createAlias(String associationPath, String alias, int joinType) {
        return createAlias(associationPath, alias, JoinType.parse(joinType));
    }

    /**
     * Deprecated!
     *
     * @param associationPath The association path
     * @param alias The alias to apply to that association path
     * @param joinType The type of join to use
     * @param withClause An additional restriction on the join
     *
     * @return {@code this}, for method chaining
     *
     * @deprecated use {@link #createAlias(String, String, JoinType, Criterion)}
     */
    @Deprecated
    public DetachedCriteria createAlias(String associationPath, String alias, int joinType, Criterion withClause) {
        return createAlias(associationPath, alias, JoinType.parse(joinType), withClause);
    }

    /**
     * Creates a nested DetachedCriteria representing the association path.
     *
     * @param associationPath The association path
     * @param alias The alias to apply to that association path
     *
     * @return the newly created, nested DetachedCriteria
     */
    public DetachedCriteria createCriteria(String associationPath, String alias) {
        return new DetachedCriteria(impl, criteria.createCriteria(associationPath, alias));
    }

    /**
     * Creates a nested DetachedCriteria representing the association path.
     *
     * @param associationPath The association path
     *
     * @return the newly created, nested DetachedCriteria
     */
    public DetachedCriteria createCriteria(String associationPath) {
        return new DetachedCriteria(impl, criteria.createCriteria(associationPath));
    }

    /**
     * Creates a nested DetachedCriteria representing the association path, specifying the type of join to use.
     *
     * @param associationPath The association path
     * @param joinType The type of join to use
     *
     * @return the newly created, nested DetachedCriteria
     */
    public DetachedCriteria createCriteria(String associationPath, JoinType joinType) {
        return new DetachedCriteria(impl, criteria.createCriteria(associationPath, joinType));
    }

    /**
     * Creates a nested DetachedCriteria representing the association path, specifying the type of join to use.
     *
     * @param associationPath The association path
     * @param alias The alias to associate with this "join".
     * @param joinType The type of join to use
     *
     * @return the newly created, nested DetachedCriteria
     */
    public DetachedCriteria createCriteria(String associationPath, String alias, JoinType joinType) {
        return new DetachedCriteria(impl, criteria.createCriteria(associationPath, alias, joinType));
    }

    /**
     * Creates a nested DetachedCriteria representing the association path, specifying the type of join to use and
     * an additional join restriction.
     *
     * @param associationPath The association path
     * @param alias The alias to associate with this "join".
     * @param joinType The type of join to use
     * @param withClause The additional join restriction
     *
     * @return the newly created, nested DetachedCriteria
     */
    public DetachedCriteria createCriteria(String associationPath, String alias, JoinType joinType,
            Criterion withClause) {
        return new DetachedCriteria(impl, criteria.createCriteria(associationPath, alias, joinType, withClause));
    }

    /**
     * Deprecated!
     *
     * @param associationPath The association path
     * @param joinType The type of join to use
     *
     * @return the newly created, nested DetachedCriteria
     *
     * @deprecated use {@link #createCriteria(String, JoinType)}
     */
    @Deprecated
    public DetachedCriteria createCriteria(String associationPath, int joinType) {
        return createCriteria(associationPath, JoinType.parse(joinType));
    }

    /**
     * Deprecated!
     *
     * @param associationPath The association path
     * @param alias The alias
     * @param joinType The type of join to use
     *
     * @return the newly created, nested DetachedCriteria
     *
     * @deprecated use {@link #createCriteria(String, String, JoinType)}
     */
    @Deprecated
    public DetachedCriteria createCriteria(String associationPath, String alias, int joinType) {
        return createCriteria(associationPath, alias, JoinType.parse(joinType));
    }

    /**
     * Deprecated!
     *
     * @param associationPath The association path
     * @param alias The alias to associate with this "join".
     * @param joinType The type of join to use
     * @param withClause The additional join restriction
     *
     * @return the newly created, nested DetachedCriteria
     *
     * @deprecated use {@link #createCriteria(String, String, JoinType, Criterion)}
     */
    @Deprecated
    public DetachedCriteria createCriteria(String associationPath, String alias, int joinType,
            Criterion withClause) {
        return createCriteria(associationPath, alias, JoinType.parse(joinType), withClause);
    }

    /**
     * Set the SQL comment to use.
     *
     * @param comment The SQL comment to use
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria setComment(String comment) {
        criteria.setComment(comment);
        return this;
    }

    /**
     * Set the lock mode to use.
     *
     * @param lockMode The lock mode to use
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria setLockMode(LockMode lockMode) {
        criteria.setLockMode(lockMode);
        return this;
    }

    /**
     * Set an alias-specific lock mode.  The specified lock mode applies only to that alias.
     *
     * @param alias The alias to apply the lock to
     * @param lockMode The lock mode to use.
     *
     * @return {@code this}, for method chaining
     */
    public DetachedCriteria setLockMode(String alias, LockMode lockMode) {
        criteria.setLockMode(alias, lockMode);
        return this;
    }

    /**
     * Set a timeout for the underlying JDBC query.
     *
     * @param timeout The timeout value to apply.
     * @return this (for method chaining)
     *
     * @see java.sql.Statement#setQueryTimeout
     */
    public DetachedCriteria setTimeout(int timeout) {
        criteria.setTimeout(timeout);
        return this;
    }

    @Override
    public String toString() {
        return "DetachableCriteria(" + criteria.toString() + ')';
    }

}