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

org.hibernate.query.sqm.tree.update.SqmUpdateStatement Maven / Gradle / Ivy

The 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 http://www.gnu.org/licenses/lgpl-2.1.html
 */
package org.hibernate.query.sqm.tree.update;

import java.util.List;
import jakarta.persistence.criteria.Expression;
import jakarta.persistence.criteria.Path;
import jakarta.persistence.criteria.Predicate;
import jakarta.persistence.criteria.Root;
import jakarta.persistence.metamodel.EntityType;
import jakarta.persistence.metamodel.SingularAttribute;

import org.hibernate.NotYetImplementedFor6Exception;
import org.hibernate.metamodel.model.domain.EntityDomainType;
import org.hibernate.query.criteria.JpaCriteriaUpdate;
import org.hibernate.query.criteria.JpaPredicate;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmQuerySource;
import org.hibernate.query.sqm.internal.SqmCriteriaNodeBuilder;
import org.hibernate.query.sqm.tree.AbstractSqmDmlStatement;
import org.hibernate.query.sqm.tree.SqmDeleteOrUpdateStatement;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.expression.SqmExpression;
import org.hibernate.query.sqm.tree.from.SqmRoot;
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
import org.hibernate.query.sqm.tree.predicate.SqmWhereClause;

/**
 * @author Steve Ebersole
 */
public class SqmUpdateStatement
		extends AbstractSqmDmlStatement
		implements SqmDeleteOrUpdateStatement, JpaCriteriaUpdate {
	private boolean versioned;
	private SqmSetClause setClause;
	private SqmWhereClause whereClause;

	public SqmUpdateStatement(SqmRoot target, NodeBuilder nodeBuilder) {
		this( target, SqmQuerySource.HQL, nodeBuilder );
	}

	public SqmUpdateStatement(SqmRoot target, SqmQuerySource querySource, NodeBuilder nodeBuilder) {
		super( target, querySource, nodeBuilder );
	}

	public SqmUpdateStatement(Class targetEntity, SqmCriteriaNodeBuilder nodeBuilder) {
		this(
				new SqmRoot<>(
						nodeBuilder.getDomainModel().entity( targetEntity ),
						null,
						nodeBuilder
				),
				SqmQuerySource.CRITERIA,
				nodeBuilder
		);
	}

	public SqmSetClause getSetClause() {
		return setClause;
	}

	public void setSetClause(SqmSetClause setClause) {
		this.setClause = setClause;
	}

	@Override
	public SqmWhereClause getWhereClause() {
		return whereClause;
	}

	@Override
	public void applyPredicate(SqmPredicate predicate) {
		if ( predicate == null ) {
			return;
		}

		if ( whereClause == null ) {
			whereClause = new SqmWhereClause( nodeBuilder() );
		}

		whereClause.applyPredicate( predicate );
	}

	public void setWhereClause(SqmWhereClause whereClause) {
		this.whereClause = whereClause;
	}

	@Override
	public Root from(Class entityClass) {
		final EntityDomainType entity = nodeBuilder().getDomainModel().entity( entityClass );
		SqmRoot root = new SqmRoot<>( entity, null, nodeBuilder() );
		setTarget( root );
		return root;
	}

	@Override
	public Root from(EntityType entity) {
		SqmRoot root = new SqmRoot<>( (EntityDomainType) entity, null, nodeBuilder() );
		setTarget( root );
		return root;
	}

	@Override
	public Root getRoot() {
		return getTarget();
	}

	@Override
	public  SqmUpdateStatement set(SingularAttribute attribute, X value) {
		throw new NotYetImplementedFor6Exception();
	}

	@Override
	public  SqmUpdateStatement set(SingularAttribute attribute, Expression value) {
		throw new NotYetImplementedFor6Exception();
	}

	@Override
	public  SqmUpdateStatement set(Path attribute, X value) {
		throw new NotYetImplementedFor6Exception();
	}

	@Override
	public  SqmUpdateStatement set(Path attribute, Expression value) {
		throw new NotYetImplementedFor6Exception();
	}

	@Override
	public SqmUpdateStatement set(String attributeName, Object value) {
		throw new NotYetImplementedFor6Exception();
	}

	@Override
	public boolean isVersioned() {
		return versioned;
	}

	@Override
	public SqmUpdateStatement versioned() {
		this.versioned = true;
		return this;
	}

	@Override
	public SqmUpdateStatement versioned(boolean versioned) {
		this.versioned = versioned;
		return this;
	}

	@Override
	public SqmUpdateStatement where(Expression restriction) {
		getWhereClause().setPredicate( (SqmPredicate) restriction );
		return this;
	}

	@Override
	public SqmUpdateStatement where(Predicate... restrictions) {
		getWhereClause().setPredicate( null );
		for ( Predicate restriction : restrictions ) {
			getWhereClause().applyPredicate( (SqmPredicate) restriction );
		}
		return this;
	}

	@Override
	public JpaPredicate getRestriction() {
		return whereClause == null ? null : whereClause.getPredicate();
	}

	@Override
	public  X accept(SemanticQueryWalker walker) {
		return walker.visitUpdateStatement( this );
	}

	public void applyAssignment(SqmPath targetPath, SqmExpression value) {
		if ( setClause == null ) {
			setClause = new SqmSetClause();
		}
		setClause.addAssignment( new SqmAssignment( targetPath, value ) );
	}

	@Override
	public void appendHqlString(StringBuilder sb) {
		sb.append( "update " );
		if ( versioned ) {
			sb.append( "versioned " );
		}
		sb.append( getTarget().getEntityName() );
		if ( getTarget().getExplicitAlias() != null ) {
			sb.append( ' ' ).append( getTarget().getExplicitAlias() );
		}
		sb.append( " set " );
		final List assignments = setClause.getAssignments();
		appendAssignment( assignments.get( 0 ), sb );
		for ( int i = 1; i < assignments.size(); i++ ) {
			sb.append( ", " );
			appendAssignment( assignments.get( i ), sb );
		}

		if ( whereClause != null && whereClause.getPredicate() != null ) {
			sb.append( " where " );
			whereClause.getPredicate().appendHqlString( sb );
		}
	}

	private static void appendAssignment(SqmAssignment sqmAssignment, StringBuilder sb) {
		sqmAssignment.getTargetPath().appendHqlString( sb );
		sb.append( " = " );
		sqmAssignment.getValue().appendHqlString( sb );
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy