@@ -398,72 +398,7 @@ private void processClasses(RoundEnvironment roundEnvironment) {
398398
399399 private void processElement (Element element , @ Nullable Element parent ) {
400400 try {
401- if ( !included ( element )
402- || hasAnnotation ( element , Constants .EXCLUDE )
403- || hasPackageAnnotation ( element , Constants .EXCLUDE )
404- || element .getModifiers ().contains ( Modifier .PRIVATE ) ) {
405- // skip it completely
406- return ;
407- }
408- else if ( isEntityOrEmbeddable ( element )
409- && !element .getModifiers ().contains ( Modifier .PRIVATE ) ) {
410- context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated entity class '" + element + "'" );
411- handleRootElementAnnotationMirrors ( element , parent );
412- }
413- else if ( hasAuxiliaryAnnotations ( element ) ) {
414- context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated class '" + element + "'" );
415- handleRootElementAuxiliaryAnnotationMirrors ( element );
416- }
417- else if ( element instanceof TypeElement typeElement ) {
418- final AnnotationMirror repository = getAnnotationMirror ( element , JD_REPOSITORY );
419- if ( repository != null ) {
420- final AnnotationValue provider = getAnnotationValue ( repository , "provider" );
421- if ( provider == null
422- || provider .getValue ().toString ().isEmpty ()
423- || provider .getValue ().toString ().equalsIgnoreCase ("hibernate" ) ) {
424- context .logMessage ( Diagnostic .Kind .OTHER , "Processing repository class '" + element + "'" );
425- final AnnotationMetaEntity metaEntity =
426- AnnotationMetaEntity .create ( typeElement , context ,
427- parentMetadata ( parent , context ::getMetaEntity ) );
428- if ( metaEntity .isInitialized () ) {
429- context .addMetaAuxiliary ( metaEntity .getQualifiedName (), metaEntity );
430- }
431- // otherwise discard it (assume it has query by magical method name stuff)
432- }
433- }
434- else {
435- for ( Element member : typeElement .getEnclosedElements () ) {
436- if ( hasAnnotation ( member , HQL , SQL , FIND ) ) {
437- context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated class '" + element + "'" );
438- final AnnotationMetaEntity metaEntity =
439- AnnotationMetaEntity .create ( typeElement , context ,
440- parentMetadata ( parent , context ::getMetaEntity ) );
441- context .addMetaAuxiliary ( metaEntity .getQualifiedName (), metaEntity );
442- break ;
443- }
444- }
445- if ( enclosesEntityOrEmbeddable ( element ) ) {
446- final NonManagedMetamodel metaEntity =
447- NonManagedMetamodel .create ( typeElement , context , false ,
448- parentMetadata ( parent , context ::getMetamodel ) );
449- context .addMetaEntity ( metaEntity .getQualifiedName (), metaEntity );
450- if ( context .generateJakartaDataStaticMetamodel () ) {
451- final NonManagedMetamodel dataMetaEntity =
452- NonManagedMetamodel .create ( typeElement , context , true ,
453- parentMetadata ( parent , context ::getDataMetaEntity ) );
454- context .addDataMetaEntity ( dataMetaEntity .getQualifiedName (), dataMetaEntity );
455- }
456-
457- }
458- }
459- }
460- if ( isClassRecordOrInterfaceType ( element ) ) {
461- for ( final Element child : element .getEnclosedElements () ) {
462- if ( isClassRecordOrInterfaceType ( child ) ) {
463- processElement ( child , element );
464- }
465- }
466- }
401+ inspectRootElement (element , parent , null );
467402 }
468403 catch ( ProcessLaterException processLaterException ) {
469404 if ( element instanceof TypeElement typeElement ) {
@@ -493,6 +428,77 @@ private boolean hasPackageAnnotation(Element element, String annotation) {
493428 return pack != null && hasAnnotation ( pack , annotation );
494429 }
495430
431+ private void inspectRootElement (Element element , @ Nullable Element parent , @ Nullable TypeElement primaryEntity ) {
432+ if ( !included ( element )
433+ || hasAnnotation ( element , Constants .EXCLUDE )
434+ || hasPackageAnnotation ( element , Constants .EXCLUDE )
435+ || element .getModifiers ().contains ( Modifier .PRIVATE ) ) {
436+ // skip it completely
437+ return ;
438+ }
439+ else if ( isEntityOrEmbeddable ( element )
440+ && !element .getModifiers ().contains ( Modifier .PRIVATE ) ) {
441+ context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated entity class '" + element + "'" );
442+ handleRootElementAnnotationMirrors ( element , parent );
443+ }
444+ else if ( hasAuxiliaryAnnotations ( element ) ) {
445+ context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated class '" + element + "'" );
446+ handleRootElementAuxiliaryAnnotationMirrors ( element );
447+ }
448+ else if ( element instanceof TypeElement typeElement ) {
449+ final AnnotationMirror repository = getAnnotationMirror ( element , JD_REPOSITORY );
450+ if ( repository != null ) {
451+ final AnnotationValue provider = getAnnotationValue ( repository , "provider" );
452+ if ( provider == null
453+ || provider .getValue ().toString ().isEmpty ()
454+ || provider .getValue ().toString ().equalsIgnoreCase ("hibernate" ) ) {
455+ context .logMessage ( Diagnostic .Kind .OTHER , "Processing repository class '" + element + "'" );
456+ final AnnotationMetaEntity metaEntity =
457+ AnnotationMetaEntity .create ( typeElement , context ,
458+ parentMetadata ( parent , context ::getMetaEntity ),
459+ primaryEntity );
460+ if ( metaEntity .isInitialized () ) {
461+ context .addMetaAuxiliary ( metaEntity .getQualifiedName (), metaEntity );
462+ }
463+ // otherwise discard it (assume it has query by magical method name stuff)
464+ }
465+ }
466+ else {
467+ for ( Element member : typeElement .getEnclosedElements () ) {
468+ if ( hasAnnotation ( member , HQL , SQL , FIND ) ) {
469+ context .logMessage ( Diagnostic .Kind .OTHER , "Processing annotated class '" + element + "'" );
470+ final AnnotationMetaEntity metaEntity =
471+ AnnotationMetaEntity .create ( typeElement , context ,
472+ parentMetadata ( parent , context ::getMetaEntity ),
473+ primaryEntity );
474+ context .addMetaAuxiliary ( metaEntity .getQualifiedName (), metaEntity );
475+ break ;
476+ }
477+ }
478+ if ( enclosesEntityOrEmbeddable ( element ) ) {
479+ final NonManagedMetamodel metaEntity =
480+ NonManagedMetamodel .create ( typeElement , context , false ,
481+ parentMetadata ( parent , context ::getMetamodel ) );
482+ context .addMetaEntity ( metaEntity .getQualifiedName (), metaEntity );
483+ if ( context .generateJakartaDataStaticMetamodel () ) {
484+ final NonManagedMetamodel dataMetaEntity =
485+ NonManagedMetamodel .create ( typeElement , context , true ,
486+ parentMetadata ( parent , context ::getDataMetaEntity ) );
487+ context .addDataMetaEntity ( dataMetaEntity .getQualifiedName (), dataMetaEntity );
488+ }
489+
490+ }
491+ }
492+ }
493+ if ( isClassRecordOrInterfaceType ( element ) ) {
494+ for ( final Element child : element .getEnclosedElements () ) {
495+ if ( isClassRecordOrInterfaceType ( child ) ) {
496+ processElement ( child , element );
497+ }
498+ }
499+ }
500+ }
501+
496502 private void createMetaModelClasses () {
497503
498504 for ( Metamodel aux : context .getMetaAuxiliaries () ) {
@@ -644,6 +650,7 @@ private void handleRootElementAnnotationMirrors(final Element element, @Nullable
644650 final TypeElement typeElement = (TypeElement ) element ;
645651 indexEntityName ( typeElement );
646652 indexEnumFields ( typeElement );
653+ indexQueryInterfaces ( typeElement );
647654
648655 final String qualifiedName = typeElement .getQualifiedName ().toString ();
649656 final Metamodel alreadyExistingMetaEntity =
@@ -700,6 +707,14 @@ private static boolean hasHandwrittenMetamodel(Element element) {
700707 .contentEquals ('_' + element .getSimpleName ().toString ()));
701708 }
702709
710+ private void indexQueryInterfaces (TypeElement typeElement ) {
711+ for ( Element element : typeElement .getEnclosedElements () ) {
712+ if ( element .getKind () == ElementKind .INTERFACE ) {
713+ inspectRootElement ( element , typeElement , typeElement );
714+ }
715+ }
716+ }
717+
703718 private void indexEntityName (TypeElement typeElement ) {
704719 final AnnotationMirror mirror = getAnnotationMirror ( typeElement , ENTITY );
705720 if ( mirror != null ) {
0 commit comments