All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.hibernate.query.criteria.internal.path.RootImpl Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha1
Show newest version
/*
 * 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 .
 */
package org.hibernate.query.criteria.internal.path;

import java.io.Serializable;
import java.util.LinkedHashSet;
import java.util.Set;

import javax.persistence.criteria.Join;
import javax.persistence.criteria.Root;
import javax.persistence.metamodel.EntityType;

import org.hibernate.query.criteria.internal.CriteriaBuilderImpl;
import org.hibernate.query.criteria.internal.CriteriaSubqueryImpl;
import org.hibernate.query.criteria.internal.FromImplementor;
import org.hibernate.query.criteria.internal.PathSource;
import org.hibernate.query.criteria.internal.compile.RenderingContext;

/**
 * Hibernate implementation of the JPA {@link Root} contract
 *
 * @author Steve Ebersole
 */
public class RootImpl extends AbstractFromImpl implements Root, Serializable {
	private final EntityType entityType;
	private final boolean allowJoins;
	private final Set> treats = new LinkedHashSet<>();

	public RootImpl(CriteriaBuilderImpl criteriaBuilder, EntityType entityType) {
		this( criteriaBuilder, entityType, true );
	}

	public RootImpl(CriteriaBuilderImpl criteriaBuilder, EntityType entityType, boolean allowJoins) {
		super( criteriaBuilder, entityType.getJavaType() );
		this.entityType = entityType;
		this.allowJoins = allowJoins;
	}

	public EntityType getEntityType() {
		return entityType;
	}

	public EntityType getModel() {
		return getEntityType();
	}

	@Override
	protected FromImplementor createCorrelationDelegate() {
		return new RootImpl( criteriaBuilder(), getEntityType() );
	}

	@Override
	public RootImpl correlateTo(CriteriaSubqueryImpl subquery) {
		return (RootImpl) super.correlateTo( subquery );
	}
	
	@Override
	protected boolean canBeJoinSource() {
		return allowJoins;
	}

	@Override
	@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
	protected RuntimeException illegalJoin() {
		return allowJoins ? super.illegalJoin() : new IllegalArgumentException( "UPDATE/DELETE criteria queries cannot define joins" );
	}

	@Override
	@SuppressWarnings("ThrowableResultOfMethodCallIgnored")
	protected RuntimeException illegalFetch() {
		return allowJoins ? super.illegalFetch() : new IllegalArgumentException( "UPDATE/DELETE criteria queries cannot define fetches" );
	}

	public String renderTableExpression(RenderingContext renderingContext) {
		prepareAlias( renderingContext );
		return getModel().getName() + " as " + getAlias();
	}

	@Override
	public String getPathIdentifier() {
		return getAlias();
	}

	@Override
	public String render(RenderingContext renderingContext) {
		prepareAlias( renderingContext );
		return getAlias();
	}
	
	public Set> getTreats() {
		return treats;
	}

	@Override
	public  RootImpl treatAs(Class treatAsType) {
		TreatedRoot treatedRoot = new TreatedRoot( this, treatAsType );
		treats.add(treatedRoot);
		return treatedRoot;
	}

	public static class TreatedRoot extends RootImpl {
		private final RootImpl original;
		private final Class treatAsType;

		public TreatedRoot(RootImpl original, Class treatAsType) {
			super(
					original.criteriaBuilder(),
					original.criteriaBuilder().getEntityManagerFactory().getMetamodel().entity( treatAsType )
			);
			this.original = original;
			this.treatAsType = treatAsType;
		}

		@Override
		public String getAlias() {
			return original.getAlias();
		}

		@Override
		public void prepareAlias(RenderingContext renderingContext) {
			// NOTE : we call `original#prepareAlias` here and during render
			//		since in some cases only one or the other will be called
			original.prepareAlias( renderingContext );
		}

		@Override
		public String render(RenderingContext renderingContext) {
			original.prepareAlias( renderingContext );
			return getTreatFragment();
		}

		protected String getTreatFragment() {
			return "treat(" + original.getAlias() + " as " + treatAsType.getName() + ")";
		}

		@Override
		public String getPathIdentifier() {
			return getTreatFragment();
		}

		@Override
		protected PathSource getPathSourceForSubPaths() {
			return this;
		}
	}

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy