Skip to content

Commit a4c7c89

Browse files
committed
HHH-19676 validate syntax in JPA @orderby in Hibernate Processor
(still need to do more semantic validation)
1 parent e9455d3 commit a4c7c89

File tree

2 files changed

+27
-0
lines changed

2 files changed

+27
-0
lines changed

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

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,7 @@
88
import org.checkerframework.checker.nullness.qual.Nullable;
99
import org.hibernate.AssertionFailure;
1010
import org.hibernate.grammars.hql.HqlLexer;
11+
import org.hibernate.metamodel.mapping.ordering.OrderByFragmentTranslator;
1112
import org.hibernate.metamodel.model.domain.EntityDomainType;
1213
import org.hibernate.processor.Context;
1314
import org.hibernate.processor.ImportContextImpl;
@@ -20,6 +21,7 @@
2021
import org.hibernate.processor.util.TypeUtils;
2122
import org.hibernate.processor.validation.ProcessorSessionFactory;
2223
import org.hibernate.processor.validation.Validation;
24+
import org.hibernate.query.SyntaxException;
2325
import org.hibernate.query.criteria.JpaEntityJoin;
2426
import org.hibernate.query.criteria.JpaRoot;
2527
import org.hibernate.query.criteria.JpaSelection;
@@ -1232,6 +1234,30 @@ private void validatePersistentMembers(List<? extends Element> membersOfClass) {
12321234
if ( hasAnnotation(memberOfClass, MANY_TO_ONE, ONE_TO_ONE, ONE_TO_MANY, MANY_TO_MANY) ) {
12331235
validateAssociation(memberOfClass);
12341236
}
1237+
if ( hasAnnotation(memberOfClass, ORDER_BY) ) {
1238+
validateOrderBy( memberOfClass );
1239+
}
1240+
}
1241+
}
1242+
1243+
private void validateOrderBy(Element memberOfClass) {
1244+
final AnnotationMirror annotation =
1245+
castNonNull(getAnnotationMirror( memberOfClass, ORDER_BY));
1246+
final AnnotationValue annotationValue = getAnnotationValue(annotation);
1247+
if ( annotationValue != null ) {
1248+
final String fragment = annotationValue.getValue().toString();
1249+
if ( !fragment.isBlank() ) {
1250+
try {
1251+
OrderByFragmentTranslator.check( fragment );
1252+
}
1253+
catch (SyntaxException e) {
1254+
final String message = "Error in ordering: " + e.getMessage();
1255+
context.message( memberOfClass, annotation, annotationValue, message, Diagnostic.Kind.ERROR );
1256+
}
1257+
catch (Exception ignored) {
1258+
// do nothing with it
1259+
}
1260+
}
12351261
}
12361262
}
12371263

tooling/metamodel-generator/src/main/java/org/hibernate/processor/util/Constants.java

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@ public final class Constants {
3737
public static final String ACCESS = "jakarta.persistence.Access";
3838
public static final String CONVERT = "jakarta.persistence.Convert";
3939
public static final String GENERATED_VALUE = "jakarta.persistence.GeneratedValue";
40+
public static final String ORDER_BY = "jakarta.persistence.OrderBy";
4041

4142
public static final String NAMED_QUERY = "jakarta.persistence.NamedQuery";
4243
public static final String NAMED_QUERIES = "jakarta.persistence.NamedQueries";

0 commit comments

Comments
 (0)