Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
Expand Up @@ -713,18 +713,19 @@ public static AttributeContainer findColumnOwner(
PersistentClass persistentClass,
String columnName,
MetadataBuildingContext context) {
final InFlightMetadataCollector metadataCollector = context.getMetadataCollector();
PersistentClass current = persistentClass;
while ( current != null ) {
try {
context.getMetadataCollector().getPhysicalColumnName( current.getTable(), columnName );
metadataCollector.getPhysicalColumnName( current.getTable(), columnName );
return current;
}
catch (MappingException me) {
//swallow it
}
for ( Join join : current.getJoins() ) {
try {
context.getMetadataCollector().getPhysicalColumnName( join.getTable(), columnName );
metadataCollector.getPhysicalColumnName( join.getTable(), columnName );
return join;
}
catch (MappingException me) {
Expand Down Expand Up @@ -785,9 +786,8 @@ public static Any buildAnyValue(
final AnnotatedColumn firstDiscriminatorColumn = discriminatorColumns.getColumns().get(0);
firstDiscriminatorColumn.linkWithValue( discriminatorDescriptor );

final JavaType<?> discriminatorJavaType = discriminatorDescriptor
.resolve()
.getRelationalJavaType();
final JavaType<?> discriminatorJavaType =
discriminatorDescriptor.resolve().getRelationalJavaType();

final Map<Object,Class<?>> discriminatorValueMappings = new HashMap<>();
processAnyDiscriminatorValues(
Expand All @@ -801,7 +801,8 @@ public static Any buildAnyValue(
value.setDiscriminatorValueMappings( discriminatorValueMappings );


final AnyDiscriminatorImplicitValues anyDiscriminatorImplicitValues = property.getDirectAnnotationUsage( AnyDiscriminatorImplicitValues.class );
final AnyDiscriminatorImplicitValues anyDiscriminatorImplicitValues =
property.getDirectAnnotationUsage( AnyDiscriminatorImplicitValues.class );
if ( anyDiscriminatorImplicitValues != null ) {
value.setImplicitDiscriminatorValueStrategy( resolveImplicitDiscriminatorStrategy( anyDiscriminatorImplicitValues, context ) );
}
Expand Down Expand Up @@ -848,7 +849,6 @@ public static MappedSuperclass getMappedSuperclassOrNull(
ClassDetails declaringClass,
Map<ClassDetails, InheritanceState> inheritanceStatePerClass,
MetadataBuildingContext context) {
boolean retrieve = false;
if ( declaringClass != null ) {
final InheritanceState inheritanceState = inheritanceStatePerClass.get( declaringClass );
if ( inheritanceState == null ) {
Expand All @@ -857,31 +857,25 @@ public static MappedSuperclass getMappedSuperclassOrNull(
);
}
if ( inheritanceState.isEmbeddableSuperclass() ) {
retrieve = true;
return context.getMetadataCollector().getMappedSuperclass( declaringClass.toJavaClass() );
}
}

if ( retrieve ) {
return context.getMetadataCollector().getMappedSuperclass( declaringClass.toJavaClass() );
}
else {
return null;
}
return null;
}

public static String getPath(PropertyHolder holder, PropertyData property) {
return qualify( holder.getPath(), property.getPropertyName() );
}

public static Map<String,String> toAliasTableMap(SqlFragmentAlias[] aliases){
final Map<String,String> ret = new HashMap<>();
final Map<String,String> result = new HashMap<>();
for ( SqlFragmentAlias aliasAnnotation : aliases ) {
final String table = aliasAnnotation.table();
if ( isNotBlank( table ) ) {
ret.put( aliasAnnotation.alias(), table );
result.put( aliasAnnotation.alias(), table );
}
}
return ret;
return result;
}

public static Map<String,String> toAliasEntityMap(SqlFragmentAlias[] aliases){
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,6 @@
import org.hibernate.query.QueryFlushMode;
import org.hibernate.query.sql.internal.ParameterParser;
import org.hibernate.query.sql.spi.ParameterRecognizer;
import org.hibernate.type.BasicType;

import java.util.ArrayList;
import java.util.Collections;
Expand Down Expand Up @@ -71,31 +70,30 @@ public static void bindQuery(
MetadataBuildingContext context,
boolean isDefault,
AnnotationTarget annotationTarget) {
if ( namedQuery == null ) {
return;
}

final String queryName = namedQuery.name();
final String queryString = namedQuery.query();
final Class<?> resultClass = namedQuery.resultClass();

if ( queryName.isBlank() ) {
throw new AnnotationException( "Class or package level '@NamedQuery' annotation must specify a 'name'" );
}
if ( namedQuery != null ) {
final String queryName = namedQuery.name();
final String queryString = namedQuery.query();
final Class<?> resultClass = namedQuery.resultClass();

if ( queryName.isBlank() ) {
throw new AnnotationException(
"Class or package level '@NamedQuery' annotation must specify a 'name'" );
}

if ( LOG.isDebugEnabled() ) {
LOG.debugf( "Binding named query: %s => %s", queryName, queryString );
}
if ( LOG.isDebugEnabled() ) {
LOG.debugf( "Binding named query: %s => %s", queryName, queryString );
}

final QueryHintDefinition hints = new QueryHintDefinition( queryName, namedQuery.hints() );
final NamedHqlQueryDefinition<?> queryMapping =
createNamedQueryDefinition( queryName, queryString, resultClass,
hints.determineLockOptions( namedQuery ), hints, annotationTarget );
if ( isDefault ) {
context.getMetadataCollector().addDefaultQuery( queryMapping );
}
else {
context.getMetadataCollector().addNamedQuery( queryMapping );
final QueryHintDefinition hints = new QueryHintDefinition( queryName, namedQuery.hints() );
final NamedHqlQueryDefinition<?> queryMapping =
createNamedQueryDefinition( queryName, queryString, resultClass,
hints.determineLockOptions( namedQuery ), hints, annotationTarget );
if ( isDefault ) {
context.getMetadataCollector().addDefaultQuery( queryMapping );
}
else {
context.getMetadataCollector().addNamedQuery( queryMapping );
}
}
}

Expand Down Expand Up @@ -286,10 +284,29 @@ public static NamedProcedureCallDefinition createStoredProcedure(
JpaAnnotations.NAMED_STORED_PROCEDURE_QUERY.createUsage( modelsContext );
nameStoredProcedureQueryAnn.name( builder.getName() );
nameStoredProcedureQueryAnn.procedureName( jdbcCall.callableName );
nameStoredProcedureQueryAnn.parameters( parametersAsAnnotations( builder, context, jdbcCall ) );

final String resultSetMappingName = builder.getResultSetMappingName();
if ( resultSetMappingName != null ) {
nameStoredProcedureQueryAnn.resultSetMappings( new String[] {resultSetMappingName} );
}

final Class<?> resultClass = builder.getResultClass();
if ( resultClass != null ) {
nameStoredProcedureQueryAnn.resultClasses( new Class[]{ builder.getResultClass() } );
}

final List<QueryHint> hints = hintsAsAnnotations( builder, modelsContext, jdbcCall );
nameStoredProcedureQueryAnn.hints( hints.toArray(QueryHint[]::new) );

final StoredProcedureParameter[] parameters = new StoredProcedureParameter[jdbcCall.parameters.size()];
nameStoredProcedureQueryAnn.parameters( parameters );
return new NamedProcedureCallDefinitionImpl( nameStoredProcedureQueryAnn );
}

private static StoredProcedureParameter[] parametersAsAnnotations(
NamedNativeQueryDefinition.Builder<?> builder, MetadataBuildingContext context, JdbcCall jdbcCall) {
final ModelsContext modelsContext = context.getBootstrapContext().getModelsContext();
final StoredProcedureParameter[] parameters =
new StoredProcedureParameter[jdbcCall.parameters.size()];
for ( int i = 0; i < jdbcCall.parameters.size(); i++ ) {
final StoredProcedureParameterJpaAnnotation param =
JpaAnnotations.STORED_PROCEDURE_PARAMETER.createUsage( modelsContext );
Expand All @@ -300,40 +317,25 @@ public static NamedProcedureCallDefinition createStoredProcedure(
param.mode( ParameterMode.IN );

final String typeName = builder.getParameterTypes().get( paramName );
final ClassDetails classDetails;
if ( isEmpty( typeName ) ) {
classDetails = ClassDetails.VOID_CLASS_DETAILS;
}
else {
final BasicType<Object> registeredType = context.getBootstrapContext()
.getTypeConfiguration()
.getBasicTypeRegistry()
.getRegisteredType( typeName );
classDetails = context.getMetadataCollector().getClassDetailsRegistry()
.getClassDetails( registeredType.getJavaType().getName() );
}
final ClassDetails classDetails =
isEmpty( typeName )
? ClassDetails.VOID_CLASS_DETAILS
: classDetails( context, typeName );
param.type( classDetails.toJavaClass() );
}
return parameters;
}

if ( builder.getResultSetMappingName() != null ) {
nameStoredProcedureQueryAnn.resultSetMappings( new String[] { builder.getResultSetMappingName() } );
}

final Class<?> resultClass = builder.getResultClass();
if ( resultClass != null ) {
nameStoredProcedureQueryAnn.resultClasses( new Class[]{ builder.getResultClass() } );
}

final List<QueryHintJpaAnnotation> hints = new ArrayList<>();

private static List<QueryHint> hintsAsAnnotations(
NamedNativeQueryDefinition.Builder<?> builder, ModelsContext modelsContext, JdbcCall jdbcCall) {
final List<QueryHint> hints = new ArrayList<>();
if ( builder.getQuerySpaces() != null ) {
final QueryHintJpaAnnotation hint =
JpaAnnotations.QUERY_HINT.createUsage( modelsContext );
hint.name( HibernateHints.HINT_NATIVE_SPACES );
hint.value( String.join( " ", builder.getQuerySpaces() ) );
hints.add( hint );
}

if ( jdbcCall.resultParameter ) {
// Mark native queries that have a result parameter as callable functions
final QueryHintJpaAnnotation hint =
Expand All @@ -342,10 +344,15 @@ public static NamedProcedureCallDefinition createStoredProcedure(
hint.value( "true" );
hints.add( hint );
}
return hints;
}

nameStoredProcedureQueryAnn.hints( hints.toArray(QueryHint[]::new) );

return new NamedProcedureCallDefinitionImpl( nameStoredProcedureQueryAnn );
private static ClassDetails classDetails(MetadataBuildingContext context, String typeName) {
final String registeredTypeName =
context.getBootstrapContext().getTypeConfiguration().getBasicTypeRegistry()
.getRegisteredType( typeName ).getJavaType().getName();
return context.getMetadataCollector().getClassDetailsRegistry()
.getClassDetails( registeredTypeName );
}

public static void bindQuery(
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -646,6 +646,10 @@ public static String truncate(String string, int length) {
return string.length() <= length ? string : string.substring( 0, length );
}

/**
* @deprecated No longer used
*/
@Deprecated(since = "7", forRemoval = true)
public static String generateAlias(String description) {
return generateAliasRoot( description ) + '_';
}
Expand All @@ -658,7 +662,10 @@ public static String generateAlias(String description) {
* @param unique A uniquing value
*
* @return an alias of the form <samp>foo1_</samp>
*
* @deprecated No longer used
*/
@Deprecated(since = "7", forRemoval = true)
public static String generateAlias(String description, int unique) {
return generateAliasRoot( description )
+ AliasConstantsHelper.get( unique );
Expand All @@ -672,7 +679,10 @@ public static String generateAlias(String description, int unique) {
* @param description The root name from which to generate a root alias.
*
* @return The generated root alias.
*
* @deprecated No longer used
*/
@Deprecated(since = "7", forRemoval = true)
private static String generateAliasRoot(String description) {
String result = truncate( unqualifyEntityName( description ), ALIAS_TRUNCATE_LENGTH )
.toLowerCase( Locale.ROOT )
Expand All @@ -689,7 +699,10 @@ private static String generateAliasRoot(String description) {
* @param alias The generated alias to be cleaned.
*
* @return The cleaned alias, stripped of any leading non-alpha characters.
*
* @deprecated No longer used
*/
@Deprecated(since = "7", forRemoval = true)
private static String cleanAlias(String alias) {
final char[] chars = alias.toCharArray();
// shortcut check...
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,16 +18,13 @@ public final class AliasConstantsHelper {
* is within the range of expected most commonly requested elements.
*/
public static String get(final int i) {
if ( i < MAX_POOL_SIZE && i >= 0 ) {
return pool[i];
}
else {
return internalAlias( i );
}
return i < MAX_POOL_SIZE && i >= 0
? pool[i]
: internalAlias( i );
}

private static String[] initPool(final int maxPoolSize) {
String[] pool = new String[maxPoolSize];
final String[] pool = new String[maxPoolSize];
for ( int i = 0; i < maxPoolSize; i++ ) {
pool[i] = internalAlias( i );
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -59,7 +59,7 @@ public O toDomainValue(R relationalForm) {
final EntityMappingType indicatedEntity = matchingValueDetails.getIndicatedEntity();
//noinspection unchecked
return indicatedEntity.getRepresentationStrategy().getMode() == RepresentationMode.POJO
&& indicatedEntity.getEntityName().equals( indicatedEntity.getJavaType().getJavaTypeClass().getName() )
&& indicatedEntity.getEntityName().equals( indicatedEntity.getJavaType().getJavaTypeClass().getName() )
? (O) indicatedEntity.getJavaType().getJavaTypeClass()
: (O) indicatedEntity.getEntityName();
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -41,15 +41,13 @@ public BasicType<?> getUnderlyingJdbcMapping() {
return underlyingJdbcMapping;
}

@SuppressWarnings("rawtypes")
@Override
public DiscriminatorConverter getValueConverter() {
return (DiscriminatorConverter) super.getValueConverter();
@Override @SuppressWarnings("unchecked")
public DiscriminatorConverter<O,?> getValueConverter() {
return (DiscriminatorConverter<O,?>) super.getValueConverter();
}

@SuppressWarnings({ "rawtypes", "unchecked" })
@Override
public Class getJavaType() {
public Class<O> getJavaType() {
return domainJavaType.getJavaTypeClass();
}

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -14,23 +14,21 @@

import org.hibernate.mapping.PersistentClass;
import org.hibernate.metamodel.UnsupportedMappingException;
import org.hibernate.metamodel.mapping.DiscriminatorType;
import org.hibernate.metamodel.mapping.EntityDiscriminatorMapping;
import org.hibernate.metamodel.mapping.EntityIdentifierMapping;
import org.hibernate.metamodel.model.domain.IdentifiableDomainType;
import org.hibernate.metamodel.model.domain.JpaMetamodel;
import org.hibernate.metamodel.model.domain.PersistentAttribute;
import org.hibernate.metamodel.model.domain.spi.JpaMetamodelImplementor;
import org.hibernate.persister.entity.DiscriminatorMetadata;
import org.hibernate.persister.entity.EntityPersister;
import org.hibernate.query.PathException;
import org.hibernate.query.sqm.SqmPathSource;
import org.hibernate.query.sqm.tree.domain.SqmManagedDomainType;
import org.hibernate.query.sqm.tree.domain.SqmPath;
import org.hibernate.query.sqm.tree.domain.SqmPersistentAttribute;
import org.hibernate.query.sqm.tree.domain.SqmSingularPersistentAttribute;
import org.hibernate.query.sqm.tree.domain.SqmDomainType;
import org.hibernate.query.sqm.tree.domain.SqmEntityDomainType;
import org.hibernate.type.StandardBasicTypes;
import org.hibernate.type.descriptor.java.JavaType;

import static org.hibernate.metamodel.model.domain.internal.DomainModelHelper.isCompatible;
Expand Down Expand Up @@ -71,16 +69,15 @@ public EntityTypeImpl(
this.jpaEntityName = jpaEntityName;
this.metamodel = metamodel;

discriminatorPathSource = entityDiscriminatorPathSource( metamodel );
}

private EntityDiscriminatorSqmPathSource<?> entityDiscriminatorPathSource(JpaMetamodelImplementor metamodel) {
final EntityPersister entityDescriptor =
metamodel.getMappingMetamodel()
.getEntityDescriptor( getHibernateEntityName() );
final DiscriminatorMetadata discriminatorMetadata = entityDescriptor.getTypeDiscriminatorMetadata();
final SqmDomainType<?> discriminatorType =
discriminatorMetadata != null
? (SqmDomainType<?>) discriminatorMetadata.getResolutionType()
: metamodel.getTypeConfiguration().getBasicTypeRegistry().resolve( StandardBasicTypes.STRING );

discriminatorPathSource = discriminatorType == null ? null
final DiscriminatorType<?> discriminatorType = entityDescriptor.getDiscriminatorDomainType();
return discriminatorType == null ? null
: new EntityDiscriminatorSqmPathSource<>( discriminatorType, this, entityDescriptor );
}

Expand Down
Loading