Skip to content

Commit 29c8b90

Browse files
committed
HHH-19364 start migrating to SelectionSpecification for Orders in Processor
1 parent 08239b6 commit 29c8b90

File tree

4 files changed

+44
-18
lines changed

4 files changed

+44
-18
lines changed

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

+5-8
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,7 @@ String specificationType() {
8080

8181
@Override
8282
void createQuery(StringBuilder declaration) {
83-
if ( !isReactive() && hasRestriction() ) {
83+
if ( isUsingSpecification() ) {
8484
declaration
8585
.append( "\t\t\t.createQuery(" )
8686
.append( localSessionName() )
@@ -95,8 +95,9 @@ void createQuery(StringBuilder declaration) {
9595
}
9696
}
9797

98+
@Override
9899
void createSpecification(StringBuilder declaration) {
99-
if ( !isReactive() && hasRestriction() ) {
100+
if ( isUsingSpecification() ) {
100101
declaration
101102
.append( annotationMetaEntity.importType( specificationType() ) )
102103
.append( ".create(_query)\n" );
@@ -105,12 +106,8 @@ void createSpecification(StringBuilder declaration) {
105106

106107
@Override
107108
boolean isUsingSpecification() {
108-
return !isReactive() && hasRestriction();
109-
}
110-
111-
private boolean hasRestriction() {
112-
return parameterTypes().stream()
113-
.anyMatch( type -> isRestrictionParam( type ) || isRangeParam( type ) );
109+
return !isReactive()
110+
&& ( hasRestriction() || hasOrder() && !isJakartaCursoredPage(containerType) );
114111
}
115112

116113
void createCriteriaQuery(StringBuilder declaration) {

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

+30-1
Original file line numberDiff line numberDiff line change
@@ -110,6 +110,17 @@ String parameterList() {
110110
.orElse("");
111111
}
112112

113+
boolean hasRestriction() {
114+
return paramTypes.stream()
115+
.anyMatch( type -> isRestrictionParam( type )
116+
|| isRangeParam( type ) );
117+
}
118+
119+
boolean hasOrder() {
120+
return paramTypes.stream().anyMatch(AbstractQueryMethod::isOrderParam)
121+
|| !orderBys.isEmpty();
122+
}
123+
113124
String strip(final String fullType) {
114125
String type = fullType;
115126
// strip off type annotations
@@ -264,10 +275,23 @@ else if ( jakartaPageRequest ) {
264275
}
265276
}
266277

278+
void handleSorting(
279+
StringBuilder declaration, List<String> paramTypes,
280+
@Nullable String containerType) {
281+
if ( !isJakartaCursoredPage(containerType)
282+
&& isUsingSpecification()
283+
&& hasOrdering(paramTypes) ) {
284+
declaration
285+
.append("\t\t\t.resort(_orders)\n");
286+
}
287+
}
288+
267289
boolean applyOrder(
268290
StringBuilder declaration, List<String> paramTypes,
269291
@Nullable String containerType, boolean unwrapped) {
270-
if ( !isJakartaCursoredPage(containerType) && hasOrdering(paramTypes) ) {
292+
if ( !isJakartaCursoredPage(containerType)
293+
&& !isUsingSpecification()
294+
&& hasOrdering(paramTypes) ) {
271295
unwrapQuery( declaration, unwrapped );
272296
declaration
273297
.append("\t\t\t.setOrder(_orders)\n");
@@ -461,6 +485,8 @@ void makeKeyedPage(StringBuilder declaration, List<String> paramTypes) {
461485

462486
void createQuery(StringBuilder declaration) {}
463487

488+
void createSpecification(StringBuilder declaration) {}
489+
464490
void setParameters(StringBuilder declaration, List<String> paramTypes, String indent) {}
465491

466492
void tryReturn(StringBuilder declaration, List<String> paramTypes, @Nullable String containerType) {
@@ -521,6 +547,9 @@ private void totalResults(StringBuilder declaration, List<String> paramTypes) {
521547
declaration
522548
.append(parameterName(JD_PAGE_REQUEST, paramTypes, paramNames))
523549
.append(".requestTotal()\n\t\t\t\t\t\t? ");
550+
// TODO: indentation is all messed up here!
551+
createSpecification( declaration );
552+
handleRestrictionParameters( declaration, paramTypes );
524553
createQuery( declaration );
525554
setParameters( declaration, paramTypes, "\t\t\t\t\t");
526555
if ( isUsingEntityManager() ) {

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

+1
Original file line numberDiff line numberDiff line change
@@ -59,6 +59,7 @@ void executeQuery(StringBuilder declaration, List<String> paramTypes) {
5959
castResult( declaration );
6060
createSpecification( declaration );
6161
handleRestrictionParameters( declaration, paramTypes );
62+
handleSorting( declaration, paramTypes, containerType );
6263
createQuery( declaration );
6364
handlePageParameters( declaration, paramTypes, containerType );
6465
boolean unwrapped = !isUsingEntityManager();

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

+8-9
Original file line numberDiff line numberDiff line change
@@ -98,6 +98,7 @@ public String getAttributeDeclarationString() {
9898
castResult( declaration );
9999
createSpecification( declaration );
100100
handleRestrictionParameters( declaration, paramTypes );
101+
handleSorting( declaration, paramTypes, containerType );
101102
createQuery( declaration );
102103
setParameters( declaration, paramTypes, "");
103104
handlePageParameters( declaration, paramTypes, containerType );
@@ -118,7 +119,7 @@ String specificationType() {
118119

119120
@Override
120121
void createQuery(StringBuilder declaration) {
121-
if ( returnTypeClass != null && !isReactive() && hasRestriction() ) {
122+
if ( isUsingSpecification() ) {
122123
declaration
123124
.append( "\t\t\t.createQuery(" )
124125
.append( localSessionName() )
@@ -142,8 +143,9 @@ void createQuery(StringBuilder declaration) {
142143
}
143144
}
144145

145-
private void createSpecification(StringBuilder declaration) {
146-
if ( returnTypeClass != null && !isReactive() && hasRestriction() ) {
146+
@Override
147+
void createSpecification(StringBuilder declaration) {
148+
if ( returnTypeClass != null && isUsingSpecification() ) {
147149
declaration
148150
.append( annotationMetaEntity.importType( specificationType() ) )
149151
.append( ".create(" )
@@ -156,12 +158,9 @@ private void createSpecification(StringBuilder declaration) {
156158

157159
@Override
158160
boolean isUsingSpecification() {
159-
return returnTypeClass != null && !isReactive() && hasRestriction();
160-
}
161-
162-
private boolean hasRestriction() {
163-
return parameterTypes().stream()
164-
.anyMatch( type -> isRestrictionParam( type ) || isRangeParam( type ) );
161+
return returnTypeClass != null
162+
&& !isReactive()
163+
&& ( hasRestriction() || hasOrder() && !isJakartaCursoredPage(containerType) );
165164
}
166165

167166
private String createQueryMethod() {

0 commit comments

Comments
 (0)