From 3f58444926f2566047a1487ff09cf4bf28a28bf2 Mon Sep 17 00:00:00 2001 From: David Thexton Date: Thu, 17 May 2012 14:47:24 +0100 Subject: [PATCH] BATCH-1848 - Strip table alias from sortKey column when determining start after value from result set and from all order by clauses (some databases, including Derby don't support one) --- .../item/database/JdbcPagingItemReader.java | 2 +- .../item/database/PagingQueryProvider.java | 7 +++++++ .../AbstractSqlPagingQueryProvider.java | 18 +++++++++++++++++- .../database/support/SqlPagingQueryUtils.java | 12 ++++++------ .../SqlWindowingPagingQueryProvider.java | 2 +- 5 files changed, 32 insertions(+), 9 deletions(-) diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java index e20d4a3c0..76b28e1fb 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/JdbcPagingItemReader.java @@ -309,7 +309,7 @@ public class JdbcPagingItemReader extends AbstractPagingItemReader impleme private class PagingRowMapper implements RowMapper { public Object mapRow(ResultSet rs, int rowNum) throws SQLException { - startAfterValue = rs.getObject(queryProvider.getSortKey()); + startAfterValue = rs.getObject(queryProvider.getSortKeyWithoutAlias()); return rowMapper.mapRow(rs, rowNum); } } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/PagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/PagingQueryProvider.java index 3a831ddea..9e0163ba5 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/PagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/PagingQueryProvider.java @@ -82,4 +82,11 @@ public interface PagingQueryProvider { */ String getSortKey(); + /** + * The sort key (unique single column name) without alias. + * + * @return the sort key used to order the query (without alias) + */ + String getSortKeyWithoutAlias(); + } diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java index 72615799c..fc5e78025 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/AbstractSqlPagingQueryProvider.java @@ -138,13 +138,29 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi } /** - * + * * @return sortKey key to use to sort and limit page content */ public String getSortKey() { return sortKey; } + /** + * + * @return sortKey key to use to sort and limit page content (without alias) + */ + public String getSortKeyWithoutAlias() { + String sortKey = getSortKey(); + int separator = sortKey.indexOf('.'); + if (separator > 0) { + int columnIndex = separator + 1; + if (columnIndex < sortKey.length()) { + sortKey = sortKey.substring(columnIndex); + } + } + return sortKey; + } + public int getParameterCount() { return parameterCount; } 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 b154cdf03..adfea3654 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 @@ -42,7 +42,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(provider.getSelectClause()); sql.append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); - sql.append(" ORDER BY ").append(provider.getSortKey()); + sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(" " + limitClause); @@ -65,7 +65,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(topClause).append(" ").append(provider.getSelectClause()); sql.append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); - sql.append(" ORDER BY ").append(provider.getSortKey()); + sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); return sql.toString(); @@ -104,7 +104,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT * FROM (SELECT ").append(selectClause).append(", ROWNUM as TMP_ROW_NUM"); sql.append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); - sql.append(" ORDER BY ").append(provider.getSortKey()); + sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(") WHERE ").append(rowNumClause); @@ -125,7 +125,7 @@ public class SqlPagingQueryUtils { .append(", ROWNUM as TMP_ROW_NUM"); sql.append(" FROM (SELECT ").append(innerSelectClause).append(" FROM ").append(provider.getFromClause()); buildWhereClause(provider, remainingPageQuery, sql); - sql.append(" ORDER BY ").append(provider.getSortKey()); + sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(")) WHERE ").append(rowNumClause); @@ -146,7 +146,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(provider.getSortKey()).append(" AS SORT_KEY"); sql.append(" FROM ").append(provider.getFromClause()); sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); - sql.append(" ORDER BY ").append(provider.getSortKey()); + sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); sql.append(" " + limitClause); @@ -166,7 +166,7 @@ public class SqlPagingQueryUtils { sql.append("SELECT ").append(topClause).append(" ").append(provider.getSortKey()).append(" AS SORT_KEY"); sql.append(" FROM ").append(provider.getFromClause()); sql.append(provider.getWhereClause() == null ? "" : " WHERE " + provider.getWhereClause()); - sql.append(" ORDER BY ").append(provider.getSortKey()); + sql.append(" ORDER BY ").append(provider.getSortKeyWithoutAlias()); buildAscendingClause(provider, sql); return sql.toString(); diff --git a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java index 25ec9860c..e3f869619 100644 --- a/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java +++ b/spring-batch-infrastructure/src/main/java/org/springframework/batch/item/database/support/SqlWindowingPagingQueryProvider.java @@ -110,7 +110,7 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi } protected String getOverClause() { - return "ORDER BY " + getSortKey() + " " + getAscendingClause(); + return "ORDER BY " + getSortKeyWithoutAlias() + " " + getAscendingClause(); } protected String getOverSubstituteClauseStart() {