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)

This commit is contained in:
David Thexton
2012-05-17 14:47:24 +01:00
committed by Dave Syer
parent 8c445bcb08
commit 3f58444926
5 changed files with 32 additions and 9 deletions

View File

@@ -309,7 +309,7 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> 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);
}
}

View File

@@ -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();
}

View File

@@ -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;
}

View File

@@ -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();

View File

@@ -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() {