diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java index 7add56f06..9da4484cb 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/Db2PagingQueryProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2012 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -25,6 +25,7 @@ import org.springframework.util.StringUtils; * * @author Thomas Risberg * @author Michael Minella + * @author Mahmoud Ben Hassine * @since 2.0 */ public class Db2PagingQueryProvider extends SqlWindowingPagingQueryProvider { @@ -37,7 +38,7 @@ public class Db2PagingQueryProvider extends SqlWindowingPagingQueryProvider { @Override public String generateRemainingPagesQuery(int pageSize) { if(StringUtils.hasText(getGroupClause())) { - return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, true, buildLimitClause(pageSize)); + return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, buildLimitClause(pageSize)); } else { return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java index 7fee3c1e7..a94728684 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/MySqlPagingQueryProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2012 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -24,6 +24,7 @@ import org.springframework.util.StringUtils; * * @author Thomas Risberg * @author Michael Minella + * @author Mahmoud Ben Hassine * @since 2.0 */ public class MySqlPagingQueryProvider extends AbstractSqlPagingQueryProvider { @@ -36,7 +37,7 @@ public class MySqlPagingQueryProvider extends AbstractSqlPagingQueryProvider { @Override public String generateRemainingPagesQuery(int pageSize) { if(StringUtils.hasText(getGroupClause())) { - return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, true, buildLimitClause(pageSize)); + return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, buildLimitClause(pageSize)); } else { return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java index 5449b1f1a..11932e9d3 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/PostgresPagingQueryProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2006-2012 the original author or authors. + * Copyright 2006-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -26,6 +26,7 @@ import org.springframework.util.StringUtils; * * @author Thomas Risberg * @author Michael Minella + * @author Mahmoud Ben Hassine * @since 2.0 */ public class PostgresPagingQueryProvider extends AbstractSqlPagingQueryProvider { @@ -38,7 +39,7 @@ public class PostgresPagingQueryProvider extends AbstractSqlPagingQueryProvider @Override public String generateRemainingPagesQuery(int pageSize) { if(StringUtils.hasText(getGroupClause())) { - return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, true, buildLimitClause(pageSize)); + return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, buildLimitClause(pageSize)); } else { return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize)); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java index a180cdf7e..10ec44dd3 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlPagingQueryUtils.java @@ -31,6 +31,7 @@ import org.springframework.util.StringUtils; * @author Thomas Risberg * @author Dave Syer * @author Michael Minella + * @author Mahmoud Ben Hassine * @since 2.0 */ public class SqlPagingQueryUtils { @@ -67,7 +68,9 @@ public class SqlPagingQueryUtils { * opposed to the first page (false) * @param limitClause the implementation specific limit clause to be used * @return the generated query + * @deprecated in favor of {@link #generateLimitGroupedSqlQuery(AbstractSqlPagingQueryProvider, java.lang.String)} */ + @Deprecated public static String generateLimitGroupedSqlQuery(AbstractSqlPagingQueryProvider provider, boolean remainingPageQuery, String limitClause) { StringBuilder sql = new StringBuilder(); @@ -86,6 +89,31 @@ public class SqlPagingQueryUtils { return sql.toString(); } + /** + * Generate SQL query string using a LIMIT clause + * + * @param provider {@link AbstractSqlPagingQueryProvider} providing the + * implementation specifics + * @param limitClause the implementation specific limit clause to be used + * @return the generated query + */ + public static String generateLimitGroupedSqlQuery(AbstractSqlPagingQueryProvider provider, String limitClause) { + StringBuilder sql = new StringBuilder(); + sql.append("SELECT * "); + sql.append(" FROM ("); + sql.append("SELECT ").append(provider.getSelectClause()); + sql.append(" FROM ").append(provider.getFromClause()); + sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); + buildGroupByClause(provider, sql); + sql.append(") AS MAIN_QRY "); + sql.append("WHERE "); + buildSortConditions(provider, sql); + sql.append(" ORDER BY ").append(buildSortClause(provider)); + sql.append(" " + limitClause); + + return sql.toString(); + } + /** * Generate SQL query string using a TOP clause * diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlitePagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlitePagingQueryProvider.java index 0ffc58d64..3d0e534f8 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlitePagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlitePagingQueryProvider.java @@ -1,5 +1,5 @@ /* - * Copyright 2014 the original author or authors. + * Copyright 2014-2021 the original author or authors. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. @@ -23,6 +23,7 @@ import org.springframework.util.StringUtils; * features. * * @author Luke Taylor + * @author Mahmoud Ben Hassine * @since 3.0.0 */ public class SqlitePagingQueryProvider extends AbstractSqlPagingQueryProvider { @@ -40,7 +41,7 @@ public class SqlitePagingQueryProvider extends AbstractSqlPagingQueryProvider { @Override public String generateRemainingPagesQuery(int pageSize) { if(StringUtils.hasText(getGroupClause())) { - return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, true, buildLimitClause(pageSize)); + return SqlPagingQueryUtils.generateLimitGroupedSqlQuery(this, buildLimitClause(pageSize)); } else { return SqlPagingQueryUtils.generateLimitSqlQuery(this, true, buildLimitClause(pageSize));