Skip to content

Commit c01d391

Browse files
committed
extract some methods on QueryBinder
+ tiny cleanup to BinderHelper
1 parent 106f821 commit c01d391

File tree

2 files changed

+72
-71
lines changed

2 files changed

+72
-71
lines changed

hibernate-core/src/main/java/org/hibernate/boot/model/internal/BinderHelper.java

Lines changed: 12 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -713,18 +713,19 @@ public static AttributeContainer findColumnOwner(
713713
PersistentClass persistentClass,
714714
String columnName,
715715
MetadataBuildingContext context) {
716+
final InFlightMetadataCollector metadataCollector = context.getMetadataCollector();
716717
PersistentClass current = persistentClass;
717718
while ( current != null ) {
718719
try {
719-
context.getMetadataCollector().getPhysicalColumnName( current.getTable(), columnName );
720+
metadataCollector.getPhysicalColumnName( current.getTable(), columnName );
720721
return current;
721722
}
722723
catch (MappingException me) {
723724
//swallow it
724725
}
725726
for ( Join join : current.getJoins() ) {
726727
try {
727-
context.getMetadataCollector().getPhysicalColumnName( join.getTable(), columnName );
728+
metadataCollector.getPhysicalColumnName( join.getTable(), columnName );
728729
return join;
729730
}
730731
catch (MappingException me) {
@@ -785,9 +786,8 @@ public static Any buildAnyValue(
785786
final AnnotatedColumn firstDiscriminatorColumn = discriminatorColumns.getColumns().get(0);
786787
firstDiscriminatorColumn.linkWithValue( discriminatorDescriptor );
787788

788-
final JavaType<?> discriminatorJavaType = discriminatorDescriptor
789-
.resolve()
790-
.getRelationalJavaType();
789+
final JavaType<?> discriminatorJavaType =
790+
discriminatorDescriptor.resolve().getRelationalJavaType();
791791

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

803803

804-
final AnyDiscriminatorImplicitValues anyDiscriminatorImplicitValues = property.getDirectAnnotationUsage( AnyDiscriminatorImplicitValues.class );
804+
final AnyDiscriminatorImplicitValues anyDiscriminatorImplicitValues =
805+
property.getDirectAnnotationUsage( AnyDiscriminatorImplicitValues.class );
805806
if ( anyDiscriminatorImplicitValues != null ) {
806807
value.setImplicitDiscriminatorValueStrategy( resolveImplicitDiscriminatorStrategy( anyDiscriminatorImplicitValues, context ) );
807808
}
@@ -848,7 +849,6 @@ public static MappedSuperclass getMappedSuperclassOrNull(
848849
ClassDetails declaringClass,
849850
Map<ClassDetails, InheritanceState> inheritanceStatePerClass,
850851
MetadataBuildingContext context) {
851-
boolean retrieve = false;
852852
if ( declaringClass != null ) {
853853
final InheritanceState inheritanceState = inheritanceStatePerClass.get( declaringClass );
854854
if ( inheritanceState == null ) {
@@ -857,31 +857,25 @@ public static MappedSuperclass getMappedSuperclassOrNull(
857857
);
858858
}
859859
if ( inheritanceState.isEmbeddableSuperclass() ) {
860-
retrieve = true;
860+
return context.getMetadataCollector().getMappedSuperclass( declaringClass.toJavaClass() );
861861
}
862862
}
863-
864-
if ( retrieve ) {
865-
return context.getMetadataCollector().getMappedSuperclass( declaringClass.toJavaClass() );
866-
}
867-
else {
868-
return null;
869-
}
863+
return null;
870864
}
871865

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

876870
public static Map<String,String> toAliasTableMap(SqlFragmentAlias[] aliases){
877-
final Map<String,String> ret = new HashMap<>();
871+
final Map<String,String> result = new HashMap<>();
878872
for ( SqlFragmentAlias aliasAnnotation : aliases ) {
879873
final String table = aliasAnnotation.table();
880874
if ( isNotBlank( table ) ) {
881-
ret.put( aliasAnnotation.alias(), table );
875+
result.put( aliasAnnotation.alias(), table );
882876
}
883877
}
884-
return ret;
878+
return result;
885879
}
886880

887881
public static Map<String,String> toAliasEntityMap(SqlFragmentAlias[] aliases){

hibernate-core/src/main/java/org/hibernate/boot/model/internal/QueryBinder.java

Lines changed: 60 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,6 @@
4040
import org.hibernate.query.QueryFlushMode;
4141
import org.hibernate.query.sql.internal.ParameterParser;
4242
import org.hibernate.query.sql.spi.ParameterRecognizer;
43-
import org.hibernate.type.BasicType;
4443

4544
import java.util.ArrayList;
4645
import java.util.Collections;
@@ -71,31 +70,30 @@ public static void bindQuery(
7170
MetadataBuildingContext context,
7271
boolean isDefault,
7372
AnnotationTarget annotationTarget) {
74-
if ( namedQuery == null ) {
75-
return;
76-
}
77-
78-
final String queryName = namedQuery.name();
79-
final String queryString = namedQuery.query();
80-
final Class<?> resultClass = namedQuery.resultClass();
81-
82-
if ( queryName.isBlank() ) {
83-
throw new AnnotationException( "Class or package level '@NamedQuery' annotation must specify a 'name'" );
84-
}
73+
if ( namedQuery != null ) {
74+
final String queryName = namedQuery.name();
75+
final String queryString = namedQuery.query();
76+
final Class<?> resultClass = namedQuery.resultClass();
77+
78+
if ( queryName.isBlank() ) {
79+
throw new AnnotationException(
80+
"Class or package level '@NamedQuery' annotation must specify a 'name'" );
81+
}
8582

86-
if ( LOG.isDebugEnabled() ) {
87-
LOG.debugf( "Binding named query: %s => %s", queryName, queryString );
88-
}
83+
if ( LOG.isDebugEnabled() ) {
84+
LOG.debugf( "Binding named query: %s => %s", queryName, queryString );
85+
}
8986

90-
final QueryHintDefinition hints = new QueryHintDefinition( queryName, namedQuery.hints() );
91-
final NamedHqlQueryDefinition<?> queryMapping =
92-
createNamedQueryDefinition( queryName, queryString, resultClass,
93-
hints.determineLockOptions( namedQuery ), hints, annotationTarget );
94-
if ( isDefault ) {
95-
context.getMetadataCollector().addDefaultQuery( queryMapping );
96-
}
97-
else {
98-
context.getMetadataCollector().addNamedQuery( queryMapping );
87+
final QueryHintDefinition hints = new QueryHintDefinition( queryName, namedQuery.hints() );
88+
final NamedHqlQueryDefinition<?> queryMapping =
89+
createNamedQueryDefinition( queryName, queryString, resultClass,
90+
hints.determineLockOptions( namedQuery ), hints, annotationTarget );
91+
if ( isDefault ) {
92+
context.getMetadataCollector().addDefaultQuery( queryMapping );
93+
}
94+
else {
95+
context.getMetadataCollector().addNamedQuery( queryMapping );
96+
}
9997
}
10098
}
10199

@@ -286,10 +284,29 @@ public static NamedProcedureCallDefinition createStoredProcedure(
286284
JpaAnnotations.NAMED_STORED_PROCEDURE_QUERY.createUsage( modelsContext );
287285
nameStoredProcedureQueryAnn.name( builder.getName() );
288286
nameStoredProcedureQueryAnn.procedureName( jdbcCall.callableName );
287+
nameStoredProcedureQueryAnn.parameters( parametersAsAnnotations( builder, context, jdbcCall ) );
288+
289+
final String resultSetMappingName = builder.getResultSetMappingName();
290+
if ( resultSetMappingName != null ) {
291+
nameStoredProcedureQueryAnn.resultSetMappings( new String[] {resultSetMappingName} );
292+
}
293+
294+
final Class<?> resultClass = builder.getResultClass();
295+
if ( resultClass != null ) {
296+
nameStoredProcedureQueryAnn.resultClasses( new Class[]{ builder.getResultClass() } );
297+
}
298+
299+
final List<QueryHint> hints = hintsAsAnnotations( builder, modelsContext, jdbcCall );
300+
nameStoredProcedureQueryAnn.hints( hints.toArray(QueryHint[]::new) );
289301

290-
final StoredProcedureParameter[] parameters = new StoredProcedureParameter[jdbcCall.parameters.size()];
291-
nameStoredProcedureQueryAnn.parameters( parameters );
302+
return new NamedProcedureCallDefinitionImpl( nameStoredProcedureQueryAnn );
303+
}
292304

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

302319
final String typeName = builder.getParameterTypes().get( paramName );
303-
final ClassDetails classDetails;
304-
if ( isEmpty( typeName ) ) {
305-
classDetails = ClassDetails.VOID_CLASS_DETAILS;
306-
}
307-
else {
308-
final BasicType<Object> registeredType = context.getBootstrapContext()
309-
.getTypeConfiguration()
310-
.getBasicTypeRegistry()
311-
.getRegisteredType( typeName );
312-
classDetails = context.getMetadataCollector().getClassDetailsRegistry()
313-
.getClassDetails( registeredType.getJavaType().getName() );
314-
}
320+
final ClassDetails classDetails =
321+
isEmpty( typeName )
322+
? ClassDetails.VOID_CLASS_DETAILS
323+
: classDetails( context, typeName );
315324
param.type( classDetails.toJavaClass() );
316325
}
326+
return parameters;
327+
}
317328

318-
if ( builder.getResultSetMappingName() != null ) {
319-
nameStoredProcedureQueryAnn.resultSetMappings( new String[] { builder.getResultSetMappingName() } );
320-
}
321-
322-
final Class<?> resultClass = builder.getResultClass();
323-
if ( resultClass != null ) {
324-
nameStoredProcedureQueryAnn.resultClasses( new Class[]{ builder.getResultClass() } );
325-
}
326-
327-
final List<QueryHintJpaAnnotation> hints = new ArrayList<>();
328-
329+
private static List<QueryHint> hintsAsAnnotations(
330+
NamedNativeQueryDefinition.Builder<?> builder, ModelsContext modelsContext, JdbcCall jdbcCall) {
331+
final List<QueryHint> hints = new ArrayList<>();
329332
if ( builder.getQuerySpaces() != null ) {
330333
final QueryHintJpaAnnotation hint =
331334
JpaAnnotations.QUERY_HINT.createUsage( modelsContext );
332335
hint.name( HibernateHints.HINT_NATIVE_SPACES );
333336
hint.value( String.join( " ", builder.getQuerySpaces() ) );
334337
hints.add( hint );
335338
}
336-
337339
if ( jdbcCall.resultParameter ) {
338340
// Mark native queries that have a result parameter as callable functions
339341
final QueryHintJpaAnnotation hint =
@@ -342,10 +344,15 @@ public static NamedProcedureCallDefinition createStoredProcedure(
342344
hint.value( "true" );
343345
hints.add( hint );
344346
}
347+
return hints;
348+
}
345349

346-
nameStoredProcedureQueryAnn.hints( hints.toArray(QueryHint[]::new) );
347-
348-
return new NamedProcedureCallDefinitionImpl( nameStoredProcedureQueryAnn );
350+
private static ClassDetails classDetails(MetadataBuildingContext context, String typeName) {
351+
final String registeredTypeName =
352+
context.getBootstrapContext().getTypeConfiguration().getBasicTypeRegistry()
353+
.getRegisteredType( typeName ).getJavaType().getName();
354+
return context.getMetadataCollector().getClassDetailsRegistry()
355+
.getClassDetails( registeredTypeName );
349356
}
350357

351358
public static void bindQuery(

0 commit comments

Comments
 (0)