File tree 5 files changed +51
-44
lines changed
antlr4/org/springframework/data/jpa/repository/query
java/org/springframework/data/jpa/repository/query
test/java/org/springframework/data/jpa/repository/query
5 files changed +51
-44
lines changed Original file line number Diff line number Diff line change @@ -85,7 +85,7 @@ cteAttributes
85
85
;
86
86
87
87
orderedQuery
88
- : (query | ' (' queryExpression ' )' ) queryOrder?
88
+ : (query | ' (' queryExpression ' )' ) queryOrder? limitClause? offsetClause? fetchClause?
89
89
;
90
90
91
91
query
94
94
;
95
95
96
96
queryOrder
97
- : orderByClause limitClause? offsetClause? fetchClause?
97
+ : orderByClause
98
98
;
99
99
100
100
fromClause
Original file line number Diff line number Diff line change @@ -61,8 +61,16 @@ public QueryRendererBuilder visitOrderedQuery(HqlParser.OrderedQueryContext ctx)
61
61
builder .appendExpression (nested );
62
62
}
63
63
64
- if (ctx .queryOrder () != null ) {
65
- builder .append (visit (ctx .queryOrder ()));
64
+ if (ctx .limitClause () != null ) {
65
+ builder .appendExpression (visit (ctx .limitClause ()));
66
+ }
67
+
68
+ if (ctx .offsetClause () != null ) {
69
+ builder .appendExpression (visit (ctx .offsetClause ()));
70
+ }
71
+
72
+ if (ctx .fetchClause () != null ) {
73
+ builder .appendExpression (visit (ctx .fetchClause ()));
66
74
}
67
75
68
76
return builder ;
@@ -235,26 +243,6 @@ public QueryTokenStream visitSelection(HqlParser.SelectionContext ctx) {
235
243
return builder ;
236
244
}
237
245
238
- @ Override
239
- public QueryRendererBuilder visitQueryOrder (HqlParser .QueryOrderContext ctx ) {
240
-
241
- QueryRendererBuilder builder = QueryRenderer .builder ();
242
-
243
- if (ctx .limitClause () != null ) {
244
- builder .appendExpression (visit (ctx .limitClause ()));
245
- }
246
-
247
- if (ctx .offsetClause () != null ) {
248
- builder .appendExpression (visit (ctx .offsetClause ()));
249
- }
250
-
251
- if (ctx .fetchClause () != null ) {
252
- builder .appendExpression (visit (ctx .fetchClause ()));
253
- }
254
-
255
- return builder ;
256
- }
257
-
258
246
private QueryRendererBuilder visitSubQuerySelectClause (SelectClauseContext ctx , QueryRendererBuilder builder ) {
259
247
260
248
if (ctx .DISTINCT () != null ) {
Original file line number Diff line number Diff line change @@ -239,6 +239,18 @@ public QueryTokenStream visitOrderedQuery(HqlParser.OrderedQueryContext ctx) {
239
239
builder .append (visit (ctx .queryOrder ()));
240
240
}
241
241
242
+ if (ctx .limitClause () != null ) {
243
+ builder .appendExpression (visit (ctx .limitClause ()));
244
+ }
245
+
246
+ if (ctx .offsetClause () != null ) {
247
+ builder .appendExpression (visit (ctx .offsetClause ()));
248
+ }
249
+
250
+ if (ctx .fetchClause () != null ) {
251
+ builder .appendExpression (visit (ctx .fetchClause ()));
252
+ }
253
+
242
254
return builder ;
243
255
}
244
256
@@ -298,26 +310,7 @@ public QueryTokenStream visitFromQuery(HqlParser.FromQueryContext ctx) {
298
310
299
311
@ Override
300
312
public QueryTokenStream visitQueryOrder (HqlParser .QueryOrderContext ctx ) {
301
-
302
- if (ctx .limitClause () == null && ctx .offsetClause () == null && ctx .fetchClause () == null ) {
303
- return visit (ctx .orderByClause ());
304
- }
305
-
306
- QueryRendererBuilder builder = QueryRenderer .builder ();
307
-
308
- builder .appendExpression (visit (ctx .orderByClause ()));
309
-
310
- if (ctx .limitClause () != null ) {
311
- builder .appendExpression (visit (ctx .limitClause ()));
312
- }
313
- if (ctx .offsetClause () != null ) {
314
- builder .appendExpression (visit (ctx .offsetClause ()));
315
- }
316
- if (ctx .fetchClause () != null ) {
317
- builder .appendExpression (visit (ctx .fetchClause ()));
318
- }
319
-
320
- return builder ;
313
+ return visit (ctx .orderByClause ());
321
314
}
322
315
323
316
@ Override
Original file line number Diff line number Diff line change @@ -179,6 +179,18 @@ private QueryRendererBuilder visitOrderedQuery(HqlParser.OrderedQueryContext ctx
179
179
}
180
180
}
181
181
182
+ if (ctx .limitClause () != null ) {
183
+ builder .appendExpression (visit (ctx .limitClause ()));
184
+ }
185
+
186
+ if (ctx .offsetClause () != null ) {
187
+ builder .appendExpression (visit (ctx .offsetClause ()));
188
+ }
189
+
190
+ if (ctx .fetchClause () != null ) {
191
+ builder .appendExpression (visit (ctx .fetchClause ()));
192
+ }
193
+
182
194
return builder ;
183
195
}
184
196
Original file line number Diff line number Diff line change @@ -1676,6 +1676,20 @@ void orderByWithNullsFirstOrLastShouldWork() {
1676
1676
});
1677
1677
}
1678
1678
1679
+ @ Test // GH-3882
1680
+ void shouldSupportLimitOffset () {
1681
+
1682
+ assertQuery ("SELECT si from StockItem si order by si.id LIMIT 10 OFFSET 10 FETCH FIRST 10 ROWS ONLY" );
1683
+ assertQuery ("SELECT si from StockItem si order by si.id LIMIT ? OFFSET ? FETCH FIRST ? ROWS ONLY" );
1684
+ assertQuery ("SELECT si from StockItem si order by si.id LIMIT :l OFFSET :o" );
1685
+ assertQuery ("SELECT si from StockItem si LIMIT :l OFFSET :o" );
1686
+ assertQuery ("SELECT si from StockItem si order by si.id LIMIT :l" );
1687
+ assertQuery ("SELECT si from StockItem si order by si.id OFFSET 1" );
1688
+ assertQuery ("SELECT si from StockItem si LIMIT 1" );
1689
+ assertQuery ("SELECT si from StockItem si OFFSET 1" );
1690
+ assertQuery ("SELECT si from StockItem si FETCH FIRST 1 ROWS ONLY" );
1691
+ }
1692
+
1679
1693
@ Test // GH-2964
1680
1694
void roundFunctionShouldWorkLikeAnyOtherFunction () {
1681
1695
You can’t perform that action at this time.
0 commit comments