Skip to content

Commit c61d49a

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 c61d49a

File tree

2 files changed

+32
-16
lines changed

2 files changed

+32
-16
lines changed

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

Lines changed: 31 additions & 15 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
}
@@ -1881,7 +1901,7 @@ else if (parameterType.startsWith(JD_SORT)) {
18811901
}
18821902

18831903
private List<OrderBy> orderByList(ExecutableElement method, TypeElement returnType) {
1884-
final TypeElement entityType = implicitEntityType( returnType );
1904+
final TypeElement entityType = explicitEntityType( returnType );
18851905
if ( entityType != null ) {
18861906
final AnnotationMirror orderByList = getAnnotationMirror( method, JD_ORDER_BY_LIST );
18871907
if ( orderByList != null ) {
@@ -2611,7 +2631,7 @@ else if ( primaryEntity != null ) {
26112631
}
26122632
}
26132633

2614-
private @Nullable TypeElement implicitEntityType(@Nullable TypeElement resultType) {
2634+
private @Nullable TypeElement explicitEntityType(@Nullable TypeElement resultType) {
26152635
if ( resultType != null && hasAnnotation(resultType, ENTITY) ) {
26162636
return resultType;
26172637
}
@@ -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 & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,5 +36,5 @@ public abstract class Books {
3636
static class Summary { Summary(String title, String publisher, String isbn) {} }
3737

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

0 commit comments

Comments
 (0)