File tree Expand file tree Collapse 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 Expand file tree Collapse file tree 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 @@ -60,8 +60,16 @@ public QueryRendererBuilder visitOrderedQuery(HqlParser.OrderedQueryContext ctx)
60
60
builder .appendExpression (nested );
61
61
}
62
62
63
- if (ctx .queryOrder () != null ) {
64
- builder .append (visit (ctx .queryOrder ()));
63
+ if (ctx .limitClause () != null ) {
64
+ builder .appendExpression (visit (ctx .limitClause ()));
65
+ }
66
+
67
+ if (ctx .offsetClause () != null ) {
68
+ builder .appendExpression (visit (ctx .offsetClause ()));
69
+ }
70
+
71
+ if (ctx .fetchClause () != null ) {
72
+ builder .appendExpression (visit (ctx .fetchClause ()));
65
73
}
66
74
67
75
return builder ;
@@ -240,26 +248,6 @@ public QueryTokenStream visitSelection(HqlParser.SelectionContext ctx) {
240
248
return builder ;
241
249
}
242
250
243
- @ Override
244
- public QueryRendererBuilder visitQueryOrder (HqlParser .QueryOrderContext ctx ) {
245
-
246
- QueryRendererBuilder builder = QueryRenderer .builder ();
247
-
248
- if (ctx .limitClause () != null ) {
249
- builder .appendExpression (visit (ctx .limitClause ()));
250
- }
251
-
252
- if (ctx .offsetClause () != null ) {
253
- builder .appendExpression (visit (ctx .offsetClause ()));
254
- }
255
-
256
- if (ctx .fetchClause () != null ) {
257
- builder .appendExpression (visit (ctx .fetchClause ()));
258
- }
259
-
260
- return builder ;
261
- }
262
-
263
251
private QueryRendererBuilder visitSubQuerySelectClause (SelectClauseContext ctx , QueryRendererBuilder builder ) {
264
252
265
253
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 @@ -162,6 +162,18 @@ private QueryRendererBuilder visitOrderedQuery(HqlParser.OrderedQueryContext ctx
162
162
}
163
163
}
164
164
165
+ if (ctx .limitClause () != null ) {
166
+ builder .appendExpression (visit (ctx .limitClause ()));
167
+ }
168
+
169
+ if (ctx .offsetClause () != null ) {
170
+ builder .appendExpression (visit (ctx .offsetClause ()));
171
+ }
172
+
173
+ if (ctx .fetchClause () != null ) {
174
+ builder .appendExpression (visit (ctx .fetchClause ()));
175
+ }
176
+
165
177
return builder ;
166
178
}
167
179
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