@@ -267,10 +267,12 @@ public T ORDER_BY(String... columns) {
267
267
*
268
268
* @param variable a limit variable string
269
269
* @return a self instance
270
+ * @see #OFFSET(String)
270
271
* @since 3.5.2
271
272
*/
272
273
public T LIMIT (String variable ) {
273
274
sql ().limit = variable ;
275
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .OFFSET_LIMIT ;
274
276
return getSelf ();
275
277
}
276
278
@@ -279,10 +281,12 @@ public T LIMIT(String variable) {
279
281
*
280
282
* @param value an offset value
281
283
* @return a self instance
284
+ * @see #OFFSET(long)
282
285
* @since 3.5.2
283
286
*/
284
287
public T LIMIT (int value ) {
285
288
sql ().limit = String .valueOf (value );
289
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .OFFSET_LIMIT ;
286
290
return getSelf ();
287
291
}
288
292
@@ -291,10 +295,12 @@ public T LIMIT(int value) {
291
295
*
292
296
* @param variable a offset variable string
293
297
* @return a self instance
298
+ * @see #LIMIT(String)
294
299
* @since 3.5.2
295
300
*/
296
301
public T OFFSET (String variable ) {
297
302
sql ().offset = variable ;
303
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .OFFSET_LIMIT ;
298
304
return getSelf ();
299
305
}
300
306
@@ -303,10 +309,68 @@ public T OFFSET(String variable) {
303
309
*
304
310
* @param value an offset value
305
311
* @return a self instance
312
+ * @see #LIMIT(int)
306
313
* @since 3.5.2
307
314
*/
308
315
public T OFFSET (long value ) {
309
316
sql ().offset = String .valueOf (value );
317
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .OFFSET_LIMIT ;
318
+ return getSelf ();
319
+ }
320
+
321
+ /**
322
+ * Set the fetch first rows variable string(e.g. {@code "#{fetchFirstRows}"}).
323
+ *
324
+ * @param variable a fetch first rows variable string
325
+ * @return a self instance
326
+ * @see #OFFSET_ROWS(String)
327
+ * @since 3.5.2
328
+ */
329
+ public T FETCH_FIRST_ROWS_ONLY (String variable ) {
330
+ sql ().limit = variable ;
331
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .ISO ;
332
+ return getSelf ();
333
+ }
334
+
335
+ /**
336
+ * Set the fetch first rows value.
337
+ *
338
+ * @param value a fetch first rows value
339
+ * @return a self instance
340
+ * @see #OFFSET_ROWS(long)
341
+ * @since 3.5.2
342
+ */
343
+ public T FETCH_FIRST_ROWS_ONLY (int value ) {
344
+ sql ().limit = String .valueOf (value );
345
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .ISO ;
346
+ return getSelf ();
347
+ }
348
+
349
+ /**
350
+ * Set the offset rows variable string(e.g. {@code "#{offset}"}).
351
+ *
352
+ * @param variable a offset rows variable string
353
+ * @return a self instance
354
+ * @see #FETCH_FIRST_ROWS_ONLY(String)
355
+ * @since 3.5.2
356
+ */
357
+ public T OFFSET_ROWS (String variable ) {
358
+ sql ().offset = variable ;
359
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .ISO ;
360
+ return getSelf ();
361
+ }
362
+
363
+ /**
364
+ * Set the offset rows value.
365
+ *
366
+ * @param value an offset rows value
367
+ * @return a self instance
368
+ * @see #FETCH_FIRST_ROWS_ONLY(int)
369
+ * @since 3.5.2
370
+ */
371
+ public T OFFSET_ROWS (long value ) {
372
+ sql ().offset = String .valueOf (value );
373
+ sql ().limitingRowsStrategy = SQLStatement .LimitingRowsStrategy .ISO ;
310
374
return getSelf ();
311
375
}
312
376
@@ -359,6 +423,40 @@ public enum StatementType {
359
423
DELETE , INSERT , SELECT , UPDATE
360
424
}
361
425
426
+ private enum LimitingRowsStrategy {
427
+ NOP {
428
+ @ Override
429
+ protected void appendClause (SafeAppendable builder , String offset , String limit ) {
430
+ // NOP
431
+ }
432
+ },
433
+ ISO {
434
+ @ Override
435
+ protected void appendClause (SafeAppendable builder , String offset , String limit ) {
436
+ if (offset != null ) {
437
+ builder .append (" OFFSET " ).append (offset ).append (" ROWS" );
438
+ }
439
+ if (limit != null ) {
440
+ builder .append (" FETCH FIRST " ).append (limit ).append (" ROWS ONLY" );
441
+ }
442
+ }
443
+ },
444
+ OFFSET_LIMIT {
445
+ @ Override
446
+ protected void appendClause (SafeAppendable builder , String offset , String limit ) {
447
+ if (limit != null ) {
448
+ builder .append (" LIMIT " ).append (limit );
449
+ }
450
+ if (offset != null ) {
451
+ builder .append (" OFFSET " ).append (offset );
452
+ }
453
+ }
454
+ };
455
+
456
+ protected abstract void appendClause (SafeAppendable builder , String offset , String limit );
457
+
458
+ }
459
+
362
460
StatementType statementType ;
363
461
List <String > sets = new ArrayList <>();
364
462
List <String > select = new ArrayList <>();
@@ -378,6 +476,7 @@ public enum StatementType {
378
476
boolean distinct ;
379
477
String offset ;
380
478
String limit ;
479
+ LimitingRowsStrategy limitingRowsStrategy = LimitingRowsStrategy .NOP ;
381
480
382
481
public SQLStatement () {
383
482
// Prevent Synthetic Access
@@ -418,12 +517,7 @@ private String selectSQL(SafeAppendable builder) {
418
517
sqlClause (builder , "GROUP BY" , groupBy , "" , "" , ", " );
419
518
sqlClause (builder , "HAVING" , having , "(" , ")" , " AND " );
420
519
sqlClause (builder , "ORDER BY" , orderBy , "" , "" , ", " );
421
- if (limit != null ) {
422
- builder .append (" LIMIT " ).append (limit );
423
- }
424
- if (offset != null ) {
425
- builder .append (" OFFSET " ).append (offset );
426
- }
520
+ limitingRowsStrategy .appendClause (builder , offset , limit );
427
521
return builder .toString ();
428
522
}
429
523
@@ -445,9 +539,7 @@ private String insertSQL(SafeAppendable builder) {
445
539
private String deleteSQL (SafeAppendable builder ) {
446
540
sqlClause (builder , "DELETE FROM" , tables , "" , "" , "" );
447
541
sqlClause (builder , "WHERE" , where , "(" , ")" , " AND " );
448
- if (limit != null ) {
449
- builder .append (" LIMIT " ).append (limit );
450
- }
542
+ limitingRowsStrategy .appendClause (builder , null , limit );
451
543
return builder .toString ();
452
544
}
453
545
@@ -456,9 +548,7 @@ private String updateSQL(SafeAppendable builder) {
456
548
joins (builder );
457
549
sqlClause (builder , "SET" , sets , "" , "" , ", " );
458
550
sqlClause (builder , "WHERE" , where , "(" , ")" , " AND " );
459
- if (limit != null ) {
460
- builder .append (" LIMIT " ).append (limit );
461
- }
551
+ limitingRowsStrategy .appendClause (builder , null , limit );
462
552
return builder .toString ();
463
553
}
464
554
@@ -494,4 +584,4 @@ public String sql(Appendable a) {
494
584
return answer ;
495
585
}
496
586
}
497
- }
587
+ }
0 commit comments