diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/DataTest.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/DataTest.java new file mode 100644 index 000000000000..2d48397acc58 --- /dev/null +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/DataTest.java @@ -0,0 +1,24 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.processor.test.data.constraint; + +import org.hibernate.processor.test.util.CompilationTest; +import org.hibernate.processor.test.util.WithClasses; +import org.junit.jupiter.api.Test; + +import static org.hibernate.processor.test.util.TestUtil.assertMetamodelClassGeneratedFor; +import static org.hibernate.processor.test.util.TestUtil.getMetaModelSourceAsString; + +@CompilationTest +class DataTest { + @Test + @WithClasses({MyEntity.class, MyConstrainedRepository.class}) + void test() { + System.out.println( getMetaModelSourceAsString( MyEntity.class ) ); + System.out.println( getMetaModelSourceAsString( MyConstrainedRepository.class ) ); + assertMetamodelClassGeneratedFor( MyEntity.class ); + assertMetamodelClassGeneratedFor( MyConstrainedRepository.class ); + } +} diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/MyConstrainedRepository.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/MyConstrainedRepository.java new file mode 100644 index 000000000000..ee53f05dd965 --- /dev/null +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/MyConstrainedRepository.java @@ -0,0 +1,21 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.processor.test.data.constraint; + +import jakarta.data.repository.CrudRepository; +import jakarta.data.repository.Find; +import jakarta.data.repository.Repository; +import jakarta.validation.Valid; +import jakarta.validation.constraints.NotNull; +import jakarta.validation.constraints.Size; + +@Repository +public interface MyConstrainedRepository extends CrudRepository { + + @Valid + @NotNull + @Find + MyEntity findByName(@NotNull @Size(min = 5) String name); +} diff --git a/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/MyEntity.java b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/MyEntity.java new file mode 100644 index 000000000000..4b30805e0462 --- /dev/null +++ b/tooling/metamodel-generator/src/jakartaData/java/org/hibernate/processor/test/data/constraint/MyEntity.java @@ -0,0 +1,18 @@ +/* + * SPDX-License-Identifier: Apache-2.0 + * Copyright Red Hat Inc. and Hibernate Authors + */ +package org.hibernate.processor.test.data.constraint; + +import jakarta.persistence.Column; +import jakarta.persistence.Entity; +import jakarta.persistence.Id; + +@Entity +public class MyEntity { + + @Id + private Long id; + @Column(unique = true) + private String name; +} diff --git a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java index f578c353464a..a8b3defd2c0b 100644 --- a/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java +++ b/tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java @@ -60,6 +60,7 @@ import java.util.Set; import java.util.StringTokenizer; import java.util.regex.Pattern; +import java.util.stream.Collectors; import java.util.stream.Stream; import jakarta.persistence.AccessType; @@ -2452,7 +2453,7 @@ private void createSingleParameterFinder( new CriteriaFinderMethod( this, method, methodName, - returnType.toString(), + typeAsString( returnType, false ), containerType, paramNames, paramTypes, @@ -3388,19 +3389,29 @@ private List parameterTypes(ExecutableElement method) { * Workaround for a bug in Java 20/21. Should not be necessary! */ private String typeAsString(TypeMirror type) { - String result = type.toString(); - for ( AnnotationMirror annotation : type.getAnnotationMirrors() ) { - final String annotationString = annotation.toString(); - result = result - // if it has a space after it, we need to remove that too - .replace(annotationString + ' ', "") - // just in case it did not have a space after it - .replace(annotationString, ""); - } - for ( AnnotationMirror annotation : type.getAnnotationMirrors() ) { - result = annotation.toString() + ' ' + result; + return typeAsString( type, true ); + } + + private String typeAsString(TypeMirror type, boolean includeAnnotations) { + if ( type instanceof DeclaredType dt && dt.asElement() instanceof TypeElement te ) { + // get the "fqcn" without any type arguments + String result = te.getQualifiedName().toString(); + // add the < ? ,? ....> as necessary: + if ( !dt.getTypeArguments().isEmpty() ) { + result += dt.getTypeArguments().stream() + .map( arg -> typeAsString( arg, true ) ) + .collect( Collectors.joining( ", ", "<", ">" ) ); + } + if ( includeAnnotations ) { + for ( AnnotationMirror annotation : type.getAnnotationMirrors() ) { + result = annotation.toString() + ' ' + result; + } + } + return result; + } + else { + return type.toString(); } - return result; } private TypeMirror parameterType(VariableElement parameter) {