API changes for query-validator
This commit is contained in:
parent
67f737f4ab
commit
3dff3fb20e
|
@ -187,9 +187,9 @@ public abstract class AbstractManagedType<J>
|
||||||
Locale.ROOT,
|
Locale.ROOT,
|
||||||
"Could not resolve attribute '%s' of '%s' due to the attribute being declared in multiple sub types: ['%s', '%s']",
|
"Could not resolve attribute '%s' of '%s' due to the attribute being declared in multiple sub types: ['%s', '%s']",
|
||||||
name,
|
name,
|
||||||
getExpressibleJavaType().getJavaType().getTypeName(),
|
getTypeName(),
|
||||||
attribute.getDeclaringType().getExpressibleJavaType().getJavaType().getTypeName(),
|
attribute.getDeclaringType().getTypeName(),
|
||||||
subTypeAttribute.getDeclaringType().getExpressibleJavaType().getJavaType().getTypeName()
|
subTypeAttribute.getDeclaringType().getTypeName()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -26,23 +26,4 @@ import org.hibernate.type.descriptor.java.JavaType;
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
public interface DomainType<J> extends SqmExpressible<J> {
|
public interface DomainType<J> extends SqmExpressible<J> {
|
||||||
/**
|
|
||||||
* The name of the type.
|
|
||||||
*
|
|
||||||
* @apiNote This is the Hibernate notion of the type name. For most types
|
|
||||||
* this will simply be the Java type (i.e. {@link Class}) name. However
|
|
||||||
* using the String allows for Hibernate's dynamic model feature.
|
|
||||||
*/
|
|
||||||
default String getTypeName() {
|
|
||||||
// default impl to handle the general case returning the Java type name
|
|
||||||
return getExpressibleJavaType().getJavaType().getTypeName();
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* The descriptor for the Java type (i.e. {@link Class}) represented by this
|
|
||||||
* DomainType.
|
|
||||||
*
|
|
||||||
* @see #getTypeName
|
|
||||||
*/
|
|
||||||
JavaType<J> getExpressibleJavaType();
|
|
||||||
}
|
}
|
||||||
|
|
|
@ -19,11 +19,11 @@ import org.hibernate.query.sqm.tree.from.SqmFrom;
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
class BagAttributeImpl<X, E>
|
public class BagAttributeImpl<X, E>
|
||||||
extends AbstractPluralAttribute<X, Collection<E>, E>
|
extends AbstractPluralAttribute<X, Collection<E>, E>
|
||||||
implements BagPersistentAttribute<X, E> {
|
implements BagPersistentAttribute<X, E> {
|
||||||
|
|
||||||
BagAttributeImpl(PluralAttributeBuilder<X, Collection<E>, E, ?> xceBuilder, MetadataContext metadataContext) {
|
public BagAttributeImpl(PluralAttributeBuilder<X, Collection<E>, E, ?> xceBuilder, MetadataContext metadataContext) {
|
||||||
super( xceBuilder, metadataContext );
|
super( xceBuilder, metadataContext );
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -23,7 +23,6 @@ import org.hibernate.metamodel.model.domain.DomainType;
|
||||||
import org.hibernate.metamodel.model.domain.EntityDomainType;
|
import org.hibernate.metamodel.model.domain.EntityDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
|
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
|
||||||
import org.hibernate.metamodel.model.domain.JpaMetamodel;
|
import org.hibernate.metamodel.model.domain.JpaMetamodel;
|
||||||
import org.hibernate.metamodel.model.domain.ManagedDomainType;
|
|
||||||
import org.hibernate.metamodel.model.domain.PersistentAttribute;
|
import org.hibernate.metamodel.model.domain.PersistentAttribute;
|
||||||
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
|
import org.hibernate.metamodel.model.domain.SingularPersistentAttribute;
|
||||||
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
|
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
|
||||||
|
@ -47,22 +46,25 @@ public class EntityTypeImpl<J>
|
||||||
private final SqmPathSource<?> discriminatorPathSource;
|
private final SqmPathSource<?> discriminatorPathSource;
|
||||||
|
|
||||||
public EntityTypeImpl(
|
public EntityTypeImpl(
|
||||||
|
String entityName,
|
||||||
|
String jpaEntityName,
|
||||||
|
boolean hasIdClass,
|
||||||
|
boolean hasIdProperty,
|
||||||
|
boolean hasVersion,
|
||||||
JavaType<J> javaType,
|
JavaType<J> javaType,
|
||||||
IdentifiableDomainType<? super J> superType,
|
IdentifiableDomainType<? super J> superType,
|
||||||
PersistentClass persistentClass,
|
|
||||||
JpaMetamodelImplementor jpaMetamodel) {
|
JpaMetamodelImplementor jpaMetamodel) {
|
||||||
super(
|
super(
|
||||||
persistentClass.getEntityName(),
|
entityName,
|
||||||
javaType,
|
javaType,
|
||||||
superType,
|
superType,
|
||||||
persistentClass.getDeclaredIdentifierMapper() != null
|
hasIdClass,
|
||||||
|| superType != null && superType.hasIdClass(),
|
hasIdProperty,
|
||||||
persistentClass.hasIdentifierProperty(),
|
hasVersion,
|
||||||
persistentClass.isVersioned(),
|
|
||||||
jpaMetamodel
|
jpaMetamodel
|
||||||
);
|
);
|
||||||
|
|
||||||
this.jpaEntityName = persistentClass.getJpaEntityName();
|
this.jpaEntityName = jpaEntityName;
|
||||||
|
|
||||||
final Queryable entityDescriptor = (Queryable)
|
final Queryable entityDescriptor = (Queryable)
|
||||||
jpaMetamodel.getMappingMetamodel()
|
jpaMetamodel.getMappingMetamodel()
|
||||||
|
@ -84,6 +86,25 @@ public class EntityTypeImpl<J>
|
||||||
entityDescriptor
|
entityDescriptor
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public EntityTypeImpl(
|
||||||
|
JavaType<J> javaType,
|
||||||
|
IdentifiableDomainType<? super J> superType,
|
||||||
|
PersistentClass persistentClass,
|
||||||
|
JpaMetamodelImplementor jpaMetamodel) {
|
||||||
|
this(
|
||||||
|
persistentClass.getEntityName(),
|
||||||
|
persistentClass.getJpaEntityName(),
|
||||||
|
persistentClass.getDeclaredIdentifierMapper() != null
|
||||||
|
|| superType != null && superType.hasIdClass(),
|
||||||
|
persistentClass.hasIdentifierProperty(),
|
||||||
|
persistentClass.isVersioned(),
|
||||||
|
javaType,
|
||||||
|
superType,
|
||||||
|
jpaMetamodel
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
public EntityTypeImpl(JavaType<J> javaTypeDescriptor, JpaMetamodelImplementor jpaMetamodel) {
|
public EntityTypeImpl(JavaType<J> javaTypeDescriptor, JpaMetamodelImplementor jpaMetamodel) {
|
||||||
super(
|
super(
|
||||||
javaTypeDescriptor.getJavaTypeClass().getName(),
|
javaTypeDescriptor.getJavaTypeClass().getName(),
|
||||||
|
|
|
@ -22,10 +22,10 @@ import org.hibernate.query.sqm.tree.from.SqmFrom;
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
class ListAttributeImpl<X, E> extends AbstractPluralAttribute<X, List<E>, E> implements ListPersistentAttribute<X, E> {
|
public class ListAttributeImpl<X, E> extends AbstractPluralAttribute<X, List<E>, E> implements ListPersistentAttribute<X, E> {
|
||||||
private final SqmPathSource<Integer> indexPathSource;
|
private final SqmPathSource<Integer> indexPathSource;
|
||||||
|
|
||||||
ListAttributeImpl(PluralAttributeBuilder<X, List<E>, E, ?> builder, MetadataContext metadataContext) {
|
public ListAttributeImpl(PluralAttributeBuilder<X, List<E>, E, ?> builder, MetadataContext metadataContext) {
|
||||||
super( builder, metadataContext );
|
super( builder, metadataContext );
|
||||||
|
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
|
|
|
@ -23,10 +23,10 @@ import org.hibernate.query.sqm.tree.from.SqmFrom;
|
||||||
/**
|
/**
|
||||||
* @author Steve Ebersole
|
* @author Steve Ebersole
|
||||||
*/
|
*/
|
||||||
class MapAttributeImpl<X, K, V> extends AbstractPluralAttribute<X, Map<K, V>, V> implements MapPersistentAttribute<X, K, V> {
|
public class MapAttributeImpl<X, K, V> extends AbstractPluralAttribute<X, Map<K, V>, V> implements MapPersistentAttribute<X, K, V> {
|
||||||
private final SqmPathSource<K> keyPathSource;
|
private final SqmPathSource<K> keyPathSource;
|
||||||
|
|
||||||
MapAttributeImpl(PluralAttributeBuilder<X, Map<K, V>, V, K> xceBuilder, MetadataContext metadataContext) {
|
public MapAttributeImpl(PluralAttributeBuilder<X, Map<K, V>, V, K> xceBuilder, MetadataContext metadataContext) {
|
||||||
super( xceBuilder, metadataContext );
|
super( xceBuilder, metadataContext );
|
||||||
|
|
||||||
this.keyPathSource = SqmMappingModelHelper.resolveSqmKeyPathSource(
|
this.keyPathSource = SqmMappingModelHelper.resolveSqmKeyPathSource(
|
||||||
|
|
|
@ -410,7 +410,7 @@ public abstract class AbstractSelectionQuery<R>
|
||||||
final String errorMessage = String.format(
|
final String errorMessage = String.format(
|
||||||
"Specified result type [%s] did not match Query selection type [%s] - multiple selections: use Tuple or array",
|
"Specified result type [%s] did not match Query selection type [%s] - multiple selections: use Tuple or array",
|
||||||
resultClass.getName(),
|
resultClass.getName(),
|
||||||
sqmExpressible.getExpressibleJavaType().getJavaType().getTypeName()
|
sqmExpressible.getTypeName()
|
||||||
);
|
);
|
||||||
throw new QueryTypeMismatchException( errorMessage );
|
throw new QueryTypeMismatchException( errorMessage );
|
||||||
}
|
}
|
||||||
|
|
|
@ -38,4 +38,17 @@ public interface SqmExpressible<J> extends BindableType<J> {
|
||||||
default SqmExpressible<J> resolveExpressible(SessionFactoryImplementor sessionFactory) {
|
default SqmExpressible<J> resolveExpressible(SessionFactoryImplementor sessionFactory) {
|
||||||
return this;
|
return this;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The name of the type.
|
||||||
|
*
|
||||||
|
* @apiNote This is the Hibernate notion of the type name. For most types
|
||||||
|
* this will simply be the Java type (i.e. {@link Class}) name. However
|
||||||
|
* using the String allows for Hibernate's dynamic model feature.
|
||||||
|
*/
|
||||||
|
default String getTypeName() {
|
||||||
|
// default impl to handle the general case returning the Java type name
|
||||||
|
JavaType<J> expressibleJavaType = getExpressibleJavaType();
|
||||||
|
return expressibleJavaType == null ? "unknown" : expressibleJavaType.getJavaType().getTypeName();
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -62,7 +62,7 @@ public interface SqmPathSource<J> extends SqmExpressible<J>, Bindable<J>, SqmExp
|
||||||
Locale.ROOT,
|
Locale.ROOT,
|
||||||
"Could not resolve attribute '%s' of '%s'",
|
"Could not resolve attribute '%s' of '%s'",
|
||||||
name,
|
name,
|
||||||
getExpressible().getExpressibleJavaType().getJavaType().getTypeName()
|
getExpressible().getTypeName()
|
||||||
)
|
)
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
|
@ -52,7 +52,6 @@ import org.hibernate.query.sqm.tree.from.SqmJoin;
|
||||||
import org.hibernate.query.sqm.tree.from.SqmRoot;
|
import org.hibernate.query.sqm.tree.from.SqmRoot;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmInPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmInPredicate;
|
||||||
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
import org.hibernate.query.sqm.tree.predicate.SqmPredicate;
|
||||||
import org.hibernate.type.BasicType;
|
|
||||||
import org.hibernate.type.descriptor.java.JavaType;
|
import org.hibernate.type.descriptor.java.JavaType;
|
||||||
|
|
||||||
import jakarta.persistence.Tuple;
|
import jakarta.persistence.Tuple;
|
||||||
|
@ -579,8 +578,10 @@ public class SqmSubQuery<T> extends AbstractSqmSelectQuery<T> implements SqmSele
|
||||||
@Override
|
@Override
|
||||||
public void applyInferableType(SqmExpressible<?> type) {
|
public void applyInferableType(SqmExpressible<?> type) {
|
||||||
//noinspection unchecked
|
//noinspection unchecked
|
||||||
this.expressibleType = (SqmExpressible<T>) type;
|
expressibleType = (SqmExpressible<T>) type;
|
||||||
setResultType( type == null ? null : expressibleType.getExpressibleJavaType().getJavaTypeClass() );
|
if ( expressibleType != null && expressibleType.getExpressibleJavaType() != null ) {
|
||||||
|
setResultType( expressibleType.getExpressibleJavaType().getJavaTypeClass() );
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private void applyInferableType(Class<T> type) {
|
private void applyInferableType(Class<T> type) {
|
||||||
|
|
Loading…
Reference in New Issue