org.hibernate.query.sqm.tree.expression.SqmFieldLiteral Maven / Gradle / Ivy
Go to download
Show more of this group Show more artifacts with this name
Show all versions of hibernate-core Show documentation
Show all versions of hibernate-core Show documentation
Hibernate's core ORM functionality
/*
* 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;
}
}