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

org.hibernate.query.sqm.tree.expression.SqmFieldLiteral Maven / Gradle / Ivy

There is a newer version: 7.0.0.Alpha2
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 http://www.gnu.org/licenses/lgpl-2.1.html
 */
package org.hibernate.query.sqm.tree.expression;

import java.lang.reflect.Field;
import java.math.BigDecimal;
import java.math.BigInteger;
import java.util.Collection;
import java.util.List;
import java.util.Locale;
import jakarta.persistence.criteria.Expression;

import org.hibernate.QueryException;
import org.hibernate.query.SemanticException;
import org.hibernate.query.criteria.JpaSelection;
import org.hibernate.query.hql.spi.SemanticPathPart;
import org.hibernate.query.hql.spi.SqmCreationState;
import org.hibernate.query.sqm.NodeBuilder;
import org.hibernate.query.sqm.SemanticQueryWalker;
import org.hibernate.query.sqm.SqmExpressable;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
import org.hibernate.query.sqm.tree.select.SqmSelectableNode;
import org.hibernate.type.descriptor.java.JavaType;

/**
 * @author Steve Ebersole
 */
public class SqmFieldLiteral implements SqmExpression, SqmExpressable, SqmSelectableNode, SemanticPathPart {
	private final T value;
	private final JavaType fieldJavaTypeDescriptor;
	private final String fieldName;
	private final NodeBuilder nodeBuilder;

	private SqmExpressable expressable;

	public SqmFieldLiteral(
			Field field,
			JavaType fieldJavaTypeDescriptor,
			NodeBuilder nodeBuilder){
		this(
				extractValue( field ),
				fieldJavaTypeDescriptor,
				field.getName(),
				nodeBuilder
		);
	}

	private static  T extractValue(Field field) {
		try {
			//noinspection unchecked
			return (T) field.get( null );
		}
		catch (IllegalAccessException e) {
			throw new QueryException( "Could not access Field value for SqmFieldLiteral", e );
		}
	}

	public SqmFieldLiteral(
			T value,
			JavaType fieldJavaTypeDescriptor,
			String fieldName,
			NodeBuilder nodeBuilder) {
		this.value = value;
		this.fieldJavaTypeDescriptor = fieldJavaTypeDescriptor;
		this.fieldName = fieldName;
		this.nodeBuilder = nodeBuilder;

		this.expressable = this;
	}

	public T getValue() {
		return value;
	}

	public JavaType getFieldJavaTypeDescriptor() {
		return fieldJavaTypeDescriptor;
	}

	public String getFieldName() {
		return fieldName;
	}

	public NodeBuilder getNodeBuilder() {
		return nodeBuilder;
	}

	@Override
	public SqmExpressable getNodeType() {
		return expressable;
	}

	@Override
	public void applyInferableType(SqmExpressable type) {
		//noinspection unchecked
//		this.expressable = (SqmExpressable) type;
	}

	@Override
	public JavaType getExpressableJavaTypeDescriptor() {
		if ( expressable == this ) {
			return fieldJavaTypeDescriptor;
		}

		return expressable.getExpressableJavaTypeDescriptor();
	}

	@Override
	public JavaType getJavaTypeDescriptor() {
		return getExpressableJavaTypeDescriptor();
	}

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

	@Override
	public void appendHqlString(StringBuilder sb) {
		SqmLiteral.appendHqlString( sb, getJavaTypeDescriptor(), getValue() );
	}

	@Override
	public NodeBuilder nodeBuilder() {
		return nodeBuilder;
	}
	@Override
	public SqmPredicate isNull() {
		return nodeBuilder().isNull( this );
	}

	@Override
	public SqmPredicate isNotNull() {
		return nodeBuilder().isNotNull( this );
	}

	@Override
	public SqmPredicate in(Object... values) {
		return nodeBuilder().in( this, values );
	}

	@Override
	public SqmPredicate in(Expression... values) {
		return nodeBuilder().in( this, values );
	}

	@Override
	public SqmPredicate in(Collection values) {
		return nodeBuilder().in( this, values );
	}

	@Override
	public SqmPredicate in(Expression> values) {
		return nodeBuilder().in( this, values );
	}

	@Override
	public SqmExpression asLong() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public SqmExpression asInteger() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public SqmExpression asFloat() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public SqmExpression asDouble() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public SqmExpression asBigDecimal() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public SqmExpression asBigInteger() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public SqmExpression asString() {
		//noinspection unchecked
		return (SqmExpression) this;
	}

	@Override
	public  SqmExpression as(Class type) {
		return null;
	}

	@Override
	public SemanticPathPart resolvePathPart(
			String name,
			boolean isTerminal,
			SqmCreationState creationState) {
		throw new SemanticException(
				String.format(
						Locale.ROOT,
						"Static field reference [%s#%s] cannot be de-referenced",
						fieldJavaTypeDescriptor.getJavaType().getTypeName(),
						fieldName
				)
		);
	}

	@Override
	public SqmPath resolveIndexedAccess(
			SqmExpression selector,
			boolean isTerminal,
			SqmCreationState creationState) {
		throw new SemanticException(
				String.format(
						Locale.ROOT,
						"Static field reference [%s#%s] cannot be de-referenced",
						fieldJavaTypeDescriptor.getJavaType().getTypeName(),
						fieldName
				)
		);
	}


	@Override
	public boolean isCompoundSelection() {
		return false;
	}

	@Override
	public List> getSelectionItems() {
		// per-JPA
		throw new IllegalStateException( "Not a compound selection" );
	}

	@Override
	public JpaSelection alias(String name) {
		return null;
	}

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

}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy