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:
committed by
Michael Minella
parent
ca91bbb375
commit
856e25a862
@@ -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 = ", ";
|
||||
|
||||
@@ -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());
|
||||
|
||||
Reference in New Issue
Block a user