Skip to content

Commit c6387a4

Browse files
committed
produce error for a Sort parameter on a repo method which returns a projection
this would have saved my ass on Quarkus Insights
1 parent 2e45aa8 commit c6387a4

File tree

2 files changed

+30
-15
lines changed

2 files changed

+30
-15
lines changed

tooling/metamodel-generator/src/main/java/org/hibernate/processor/annotation/AnnotationMetaEntity.java

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1791,17 +1791,37 @@ private void createCriteriaFinder(
17911791
);
17921792
}
17931793

1794-
private void checkFinderParameter(TypeElement entity, VariableElement parameter) {
1794+
private void checkFinderParameter(@Nullable TypeElement entity, VariableElement parameter) {
17951795
final Types types = context.getTypeUtils();
17961796
final TypeMirror parameterType = parameterType(parameter);
17971797
final String typeName = parameterType.toString();
1798-
if ( isOrderParam( typeName ) || isRestrictionParam( typeName ) ) {
1798+
if ( isRestrictionParam( typeName ) ) {
17991799
final TypeMirror typeArgument = getTypeArgument( parameterType );
1800-
if ( typeArgument == null ) {
1801-
missingTypeArgError( entity.getSimpleName().toString(), parameter, typeName );
1800+
final TypeElement implicitEntityType = entity == null ? primaryEntity : entity;
1801+
if ( implicitEntityType != null ) {
1802+
if ( typeArgument == null ) {
1803+
missingTypeArgError( implicitEntityType.getSimpleName().toString(), parameter, typeName );
1804+
}
1805+
else if ( !types.isSameType( typeArgument, implicitEntityType.asType() ) ) {
1806+
wrongTypeArgError( implicitEntityType.getSimpleName().toString(), parameter, typeName );
1807+
}
18021808
}
1803-
else if ( !types.isSameType( typeArgument, entity.asType() ) ) {
1804-
wrongTypeArgError( entity.getSimpleName().toString(), parameter, typeName );
1809+
// else {
1810+
// message( parameter, "repository method does have well-defined entity type", Diagnostic.Kind.ERROR );
1811+
// }
1812+
}
1813+
else if ( isOrderParam( typeName ) ) {
1814+
final TypeMirror typeArgument = getTypeArgument( parameterType );
1815+
if ( entity != null ) {
1816+
if ( typeArgument == null ) {
1817+
missingTypeArgError( entity.getSimpleName().toString(), parameter, typeName );
1818+
}
1819+
else if ( !types.isSameType( typeArgument, entity.asType() ) ) {
1820+
wrongTypeArgError( entity.getSimpleName().toString(), parameter, typeName );
1821+
}
1822+
}
1823+
else {
1824+
message( parameter, "repository method does not return entity type", Diagnostic.Kind.ERROR );
18051825
}
18061826
}
18071827
}
@@ -3224,24 +3244,20 @@ private void checkParameters(
32243244
}
32253245
if ( returnType != null ) {
32263246
for ( VariableElement parameter : method.getParameters() ) {
3227-
final TypeElement entity = implicitEntityType(returnType);
3228-
if ( entity != null ) {
3229-
checkFinderParameter(entity, parameter);
3230-
}
3231-
// else? what?
3247+
checkFinderParameter( explicitEntityType(returnType), parameter );
32323248
}
32333249
}
32343250
}
32353251

3236-
private @Nullable TypeElement implicitEntityType(@Nullable TypeMirror resultType) {
3252+
private @Nullable TypeElement explicitEntityType(@Nullable TypeMirror resultType) {
32373253
if ( resultType != null && resultType.getKind() == TypeKind.DECLARED) {
32383254
final DeclaredType declaredType = (DeclaredType) resultType;
32393255
final Element typeElement = declaredType.asElement();
32403256
if ( hasAnnotation(typeElement, ENTITY) ) {
32413257
return (TypeElement) typeElement;
32423258
}
32433259
}
3244-
return primaryEntity;
3260+
return null;
32453261
}
32463262

32473263
private static boolean typeNameEquals(TypeMirror parameterType, String typeName) {

tooling/metamodel-generator/src/test/java/org/hibernate/processor/test/hqlsql/Books.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,6 @@
1010
import org.hibernate.StatelessSession;
1111
import org.hibernate.annotations.processing.Find;
1212
import org.hibernate.annotations.processing.HQL;
13-
import org.hibernate.query.Order;
1413

1514
import java.util.List;
1615

@@ -36,5 +35,5 @@ public abstract class Books {
3635
static class Summary { Summary(String title, String publisher, String isbn) {} }
3736

3837
@HQL("select title, publisher.name, isbn from Book")
39-
abstract List<Summary> summarize(Session session, Order<Summary> order);
38+
abstract List<Summary> summarize(Session session);
4039
}

0 commit comments

Comments
 (0)