BATCH-2040: Fix for erroneous SQL-Query in PagingQueryProvider

- added method for replacing qualifiers with subquery-qualifiers in
select clause
- refactored buildsort method
- Replaced HashMap with LinkedHashMap for right sort orders
This commit is contained in:
Arne Borrmann
2013-06-12 08:56:54 +02:00
committed by Michael Minella
parent ca91bbb375
commit 856e25a862
3 changed files with 50 additions and 5 deletions

View File

@@ -246,10 +246,20 @@ public class SqlPagingQueryUtils {
* @return a String that can be appended to an ORDER BY clause.
*/
public static String buildSortClause(AbstractSqlPagingQueryProvider provider) {
return buildSortClause(provider.getSortKeys());
}
/**
* Generates ORDER BY attributes based on the sort keys.
*
* @param sortKeys
* @return a String that can be appended to an ORDER BY clause.
*/
public static String buildSortClause(Map<String, Order> sortKeys) {
StringBuilder builder = new StringBuilder();
String prefix = "";
for (Map.Entry<String, Order> sortKey : provider.getSortKeys().entrySet()) {
for (Map.Entry<String, Order> sortKey : sortKeys.entrySet()) {
builder.append(prefix);
prefix = ", ";

View File

@@ -16,6 +16,7 @@
package org.springframework.batch.item.database.support;
import java.util.LinkedHashMap;
import java.util.Map;
import org.springframework.batch.item.database.Order;
@@ -102,7 +103,7 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
StringBuilder sql = new StringBuilder();
sql.append("SELECT ");
buildSortKeySelect(sql);
buildSortKeySelect(sql, getSortKeysReplaced(extractTableAlias()));
sql.append(" FROM ( ");
sql.append("SELECT ");
buildSortKeySelect(sql);
@@ -115,14 +116,30 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
sql.append(getOverSubstituteClauseEnd());
sql.append(") ").append(getSubQueryAlias()).append("WHERE ").append(extractTableAlias()).append(
"ROW_NUMBER = ").append(lastRowNum);
sql.append(" ORDER BY ").append(SqlPagingQueryUtils.buildSortClause(this));
sql.append(" ORDER BY ").append(SqlPagingQueryUtils.buildSortClause(getSortKeysReplaced(extractTableAlias())));
return sql.toString();
}
private void buildSortKeySelect(StringBuilder sql) {
String prefix = "";
private Map<String, Order> getSortKeysReplaced(Object qualifierReplacement) {
final String newQualifier = "" + qualifierReplacement;
final Map<String, Order> sortKeys = new LinkedHashMap<String, Order>();
for (Map.Entry<String, Order> sortKey : getSortKeys().entrySet()) {
sortKeys.put(sortKey.getKey().replaceFirst("^.*\\.", newQualifier), sortKey.getValue());
}
return sortKeys;
}
private void buildSortKeySelect(StringBuilder sql) {
buildSortKeySelect(sql, null);
}
private void buildSortKeySelect(StringBuilder sql, Map<String, Order> sortKeys) {
String prefix = "";
if (sortKeys == null) {
sortKeys = getSortKeys();
}
for (Map.Entry<String, Order> sortKey : sortKeys.entrySet()) {
sql.append(prefix);
prefix = ", ";
sql.append(sortKey.getKey());