BATCH-760: added parameter support to all PagingItemReaders
This commit is contained in:
@@ -8,6 +8,7 @@ import org.apache.commons.logging.Log;
|
||||
import org.apache.commons.logging.LogFactory;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
/**
|
||||
* Abstract {@link org.springframework.batch.item.ItemReader} for to extend when reading database records in a paging
|
||||
|
||||
@@ -36,6 +36,8 @@ public class IbatisPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
|
||||
private SqlMapClientTemplate sqlMapClientTemplate;
|
||||
|
||||
private Map<String, Object> parameterValues;
|
||||
|
||||
public IbatisPagingItemReader() {
|
||||
setName(ClassUtils.getShortName(IbatisPagingItemReader.class));
|
||||
}
|
||||
@@ -48,6 +50,16 @@ public class IbatisPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
this.queryId = queryId;
|
||||
}
|
||||
|
||||
/**
|
||||
* The parameter values to be used for the query execution.
|
||||
*
|
||||
* @param parameterValues the values keyed by the parameter named used in the query string.
|
||||
*/
|
||||
public void setParameterValues(Map<String, Object> parameterValues) {
|
||||
this.parameterValues = parameterValues;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Check mandatory properties.
|
||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
||||
@@ -62,8 +74,10 @@ public class IbatisPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void doReadPage() {
|
||||
//TODO: add support for parameter map
|
||||
Map<String, Object> parameters = new HashMap<String, Object>();
|
||||
if (parameterValues != null) {
|
||||
parameters.putAll(parameterValues);
|
||||
}
|
||||
results = sqlMapClientTemplate.queryForList(queryId, parameters, (page * pageSize), pageSize);
|
||||
}
|
||||
|
||||
|
||||
@@ -232,7 +232,7 @@ public class JdbcCursorItemReader<T> extends AbstractItemReaderItemStream<T> imp
|
||||
* Throw a SQLWarningException if we're not ignoring warnings, else log the
|
||||
* warnings (at debug level).
|
||||
*
|
||||
* @param warning the warnings object from the current statement. May be
|
||||
* @param warnings the warnings object from the current statement. May be
|
||||
* <code>null</code>, in which case this method does nothing.
|
||||
*
|
||||
* @see org.springframework.jdbc.SQLWarningException
|
||||
|
||||
@@ -27,6 +27,11 @@ import org.springframework.jdbc.core.simple.ParameterizedRowMapper;
|
||||
|
||||
import javax.sql.DataSource;
|
||||
import java.util.ArrayList;
|
||||
import java.util.Map;
|
||||
import java.util.List;
|
||||
import java.util.LinkedHashMap;
|
||||
import java.util.SortedMap;
|
||||
import java.util.TreeMap;
|
||||
import java.sql.ResultSet;
|
||||
import java.sql.SQLException;
|
||||
|
||||
@@ -56,6 +61,8 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
|
||||
private PagingQueryProvider queryProvider;
|
||||
|
||||
private Map<String, Object> parameterValues;
|
||||
|
||||
private SimpleJdbcTemplate simpleJdbcTemplate;
|
||||
|
||||
private ParameterizedRowMapper<T> parameterizedRowMapper;
|
||||
@@ -87,6 +94,18 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
this.parameterizedRowMapper = parameterizedRowMapper;
|
||||
}
|
||||
|
||||
/**
|
||||
* The parameter values to be used for the query execution. If you use named parameters then the
|
||||
* key should be the name used in the query clause. If you use "?" placeholders then the key should be
|
||||
* the relative index that the parameter appears in the query string built using the select, from and
|
||||
* where cluases specified.
|
||||
*
|
||||
* @param parameterValues the values keyed by the parameter named/index used in the query string.
|
||||
*/
|
||||
public void setParameterValues(Map<String, Object> parameterValues) {
|
||||
this.parameterValues = parameterValues;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check mandatory properties.
|
||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
||||
@@ -105,7 +124,6 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
|
||||
@Override
|
||||
protected void doReadPage() {
|
||||
//TODO: add support for parameter map
|
||||
|
||||
if (results == null) {
|
||||
results = new ArrayList<T>();
|
||||
@@ -118,26 +136,43 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("SQL used for reading first page: [" + firstPageSql + "]");
|
||||
}
|
||||
simpleJdbcTemplate.getJdbcOperations().query(firstPageSql,
|
||||
new RowCallbackHandler() {
|
||||
public void processRow(ResultSet rs) throws SQLException {
|
||||
startAfterValue = rs.getObject(1);
|
||||
results.add(parameterizedRowMapper.mapRow(rs, results.size()));
|
||||
}
|
||||
});
|
||||
if (parameterValues != null && parameterValues.size() > 0) {
|
||||
if (this.queryProvider.isUsingNamedParameters()) {
|
||||
simpleJdbcTemplate.getNamedParameterJdbcOperations().query(firstPageSql,
|
||||
getParameterMap(parameterValues, null),
|
||||
new RowCallbackHandler() {
|
||||
public void processRow(ResultSet rs) throws SQLException {
|
||||
startAfterValue = rs.getObject(1);
|
||||
results.add(parameterizedRowMapper.mapRow(rs, results.size()));
|
||||
}
|
||||
});
|
||||
}
|
||||
else {
|
||||
simpleJdbcTemplate.getJdbcOperations().query(firstPageSql,
|
||||
getParameterList(parameterValues, null).toArray(),
|
||||
new PagingRowCallbackHandler());
|
||||
}
|
||||
}
|
||||
else {
|
||||
simpleJdbcTemplate.getJdbcOperations().query(firstPageSql,
|
||||
new PagingRowCallbackHandler());
|
||||
}
|
||||
|
||||
}
|
||||
else {
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("SQL used for reading remaining pages: [" + remainingPagesSql + "]");
|
||||
}
|
||||
simpleJdbcTemplate.getJdbcOperations().query(remainingPagesSql,
|
||||
new Object[] {startAfterValue},
|
||||
new RowCallbackHandler() {
|
||||
public void processRow(ResultSet rs) throws SQLException {
|
||||
startAfterValue = rs.getObject(1);
|
||||
results.add(parameterizedRowMapper.mapRow(rs, results.size()));
|
||||
}
|
||||
});
|
||||
if (this.queryProvider.isUsingNamedParameters()) {
|
||||
simpleJdbcTemplate.getNamedParameterJdbcOperations().query(remainingPagesSql,
|
||||
getParameterMap(parameterValues, startAfterValue),
|
||||
new PagingRowCallbackHandler());
|
||||
}
|
||||
else {
|
||||
simpleJdbcTemplate.getJdbcOperations().query(remainingPagesSql,
|
||||
getParameterList(parameterValues, startAfterValue).toArray(),
|
||||
new PagingRowCallbackHandler());
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
@@ -165,4 +200,42 @@ public class JdbcPagingItemReader<T> extends AbstractPagingItemReader<T> impleme
|
||||
|
||||
}
|
||||
|
||||
private Map<String, Object> getParameterMap(Map<String, Object> values, Object sortKeyValue) {
|
||||
Map<String, Object> parameterMap = new LinkedHashMap<String, Object>();
|
||||
if (values != null) {
|
||||
parameterMap.putAll(values);
|
||||
}
|
||||
if (sortKeyValue != null) {
|
||||
parameterMap.put("_sortKey", sortKeyValue);
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using parameterMap:" + parameterMap);
|
||||
}
|
||||
System.out.println();
|
||||
return parameterMap;
|
||||
}
|
||||
|
||||
private List<Object> getParameterList(Map<String, Object> values, Object sortKeyValue) {
|
||||
SortedMap<String, Object> sm = new TreeMap<String, Object>();
|
||||
if (values != null) {
|
||||
sm.putAll(values);
|
||||
}
|
||||
List<Object> parameterList = new ArrayList<Object>();
|
||||
parameterList.addAll(sm.values());
|
||||
if (sortKeyValue != null) {
|
||||
parameterList.add(sortKeyValue);
|
||||
}
|
||||
if (logger.isDebugEnabled()) {
|
||||
logger.debug("Using parameterList:" + parameterList);
|
||||
}
|
||||
return parameterList;
|
||||
}
|
||||
|
||||
private class PagingRowCallbackHandler implements RowCallbackHandler {
|
||||
public void processRow(ResultSet rs) throws SQLException {
|
||||
startAfterValue = rs.getObject(1);
|
||||
results.add(parameterizedRowMapper.mapRow(rs, results.size()));
|
||||
}
|
||||
}
|
||||
|
||||
}
|
||||
|
||||
@@ -62,6 +62,8 @@ public class JpaPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
|
||||
private String queryString;
|
||||
|
||||
private Map<String, Object> parameterValues;
|
||||
|
||||
public JpaPagingItemReader() {
|
||||
setName(ClassUtils.getShortName(JpaPagingItemReader.class));
|
||||
}
|
||||
@@ -70,6 +72,15 @@ public class JpaPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
this.entityManagerFactory = entityManagerFactory;
|
||||
}
|
||||
|
||||
/**
|
||||
* The parameter values to be used for the query execution.
|
||||
*
|
||||
* @param parameterValues the values keyed by the parameter named used in the query string.
|
||||
*/
|
||||
public void setParameterValues(Map<String, Object> parameterValues) {
|
||||
this.parameterValues = parameterValues;
|
||||
}
|
||||
|
||||
public void afterPropertiesSet() throws Exception {
|
||||
super.afterPropertiesSet();
|
||||
Assert.notNull(entityManagerFactory);
|
||||
@@ -86,7 +97,6 @@ public class JpaPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
@Override
|
||||
@SuppressWarnings("unchecked")
|
||||
protected void doReadPage() {
|
||||
//TODO: add support for parameter map
|
||||
|
||||
EntityManager entityManager =
|
||||
entityManagerFactory.createEntityManager(jpaPropertyMap);
|
||||
@@ -101,6 +111,12 @@ public class JpaPagingItemReader<T> extends AbstractPagingItemReader<T> {
|
||||
.setFirstResult(page * pageSize)
|
||||
.setMaxResults(pageSize);
|
||||
|
||||
if (parameterValues != null) {
|
||||
for (Map.Entry<String, Object> me : parameterValues.entrySet()) {
|
||||
query.setParameter(me.getKey(), me.getValue());
|
||||
}
|
||||
}
|
||||
|
||||
results = query.getResultList();
|
||||
|
||||
entityManager.flush();
|
||||
|
||||
@@ -18,6 +18,10 @@ package org.springframework.batch.item.database.support;
|
||||
import javax.sql.DataSource;
|
||||
|
||||
import org.springframework.util.Assert;
|
||||
import org.springframework.dao.InvalidDataAccessApiUsageException;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.ArrayList;
|
||||
|
||||
/**
|
||||
* Abstract SQL Paging Query Provider to serve as a base class for all provided SQL paging query providers.
|
||||
@@ -43,6 +47,11 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
|
||||
private String sortKey;
|
||||
|
||||
private int parameterCount;
|
||||
|
||||
private boolean usingNamedParameters;
|
||||
|
||||
|
||||
/**
|
||||
* @param selectClause SELECT clause part of SQL query string
|
||||
*/
|
||||
@@ -124,6 +133,24 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
return sortKey;
|
||||
}
|
||||
|
||||
|
||||
public int getParameterCount() {
|
||||
return parameterCount;
|
||||
}
|
||||
|
||||
public boolean isUsingNamedParameters() {
|
||||
return usingNamedParameters;
|
||||
}
|
||||
|
||||
/**
|
||||
*
|
||||
* @return place holder for sortKey. Will vary depending on whethernamed parameters or traditional placeholders
|
||||
* are used in query strings.
|
||||
*/
|
||||
protected String getSortKeyPlaceHolder() {
|
||||
return usingNamedParameters ? ":_sortKey" : "?";
|
||||
}
|
||||
|
||||
/**
|
||||
* Check mandatory properties.
|
||||
* @see org.springframework.beans.factory.InitializingBean#afterPropertiesSet()
|
||||
@@ -133,6 +160,20 @@ public abstract class AbstractSqlPagingQueryProvider implements PagingQueryProvi
|
||||
Assert.hasLength(selectClause, "selectClause must be specified");
|
||||
Assert.hasLength(fromClause, "fromClause must be specified");
|
||||
Assert.hasLength(sortKey, "sortKey must be specified");
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(selectClause);
|
||||
sql.append(" FROM ").append(fromClause);
|
||||
if (whereClause != null) {
|
||||
sql.append(" WHERE ").append(whereClause);
|
||||
}
|
||||
List<String> namedParameters = new ArrayList<String>();
|
||||
parameterCount = JdbcParameterUtils.countParameterPlaceholders(sql.toString(), namedParameters);
|
||||
if (namedParameters.size() > 0) {
|
||||
if (parameterCount != namedParameters.size()) {
|
||||
throw new InvalidDataAccessApiUsageException("You can't use both named parameters and classic \"?\" placeholders: " + sql);
|
||||
}
|
||||
usingNamedParameters = true;
|
||||
}
|
||||
}
|
||||
|
||||
public abstract String generateFirstPageQuery(int pageSize);
|
||||
|
||||
@@ -26,8 +26,12 @@ public class Db2PagingQueryProvider extends SqlWindowingPagingQueryProvider {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
sql.append(" FETCH FIRST ").append(pageSize).append(" ROWS ONLY");
|
||||
|
||||
|
||||
@@ -39,8 +39,12 @@ public class HsqlPagingQueryProvider extends AbstractSqlPagingQueryProvider {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
|
||||
return sql.toString();
|
||||
|
||||
@@ -0,0 +1,115 @@
|
||||
/*
|
||||
* Copyright 2002-2008 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.
|
||||
* You may obtain a copy of the License at
|
||||
*
|
||||
* http://www.apache.org/licenses/LICENSE-2.0
|
||||
*
|
||||
* Unless required by applicable law or agreed to in writing, software
|
||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||
* See the License for the specific language governing permissions and
|
||||
* limitations under the License.
|
||||
*/
|
||||
|
||||
package org.springframework.batch.item.database.support;
|
||||
|
||||
import java.util.Map;
|
||||
import java.util.HashMap;
|
||||
import java.util.List;
|
||||
|
||||
/**
|
||||
* Helper methods for SQL statement parameter parsing.
|
||||
*
|
||||
* Only intended for internal use.
|
||||
*
|
||||
* @author Thomas Risberg
|
||||
* @author Juergen Hoeller
|
||||
* @since 2.0
|
||||
*/
|
||||
public class JdbcParameterUtils {
|
||||
|
||||
/**
|
||||
* Count the occurrences of the character placeholder in an SQL string
|
||||
* <code>sql</code>. The character placeholder is not counted if it appears
|
||||
* within a literal, that is, surrounded by single or double quotes. This method will
|
||||
* count traditional placeholders in the form of a question mark ('?') as well as
|
||||
* named parameters indicated with a leading ':' or '&'.
|
||||
*
|
||||
* The code for this method is taken from an early version of the
|
||||
* {@link org.springframework.jdbc.core.namedparam.NamedParameterUtils}
|
||||
* class. That method was later removed after some refactoring, but the code
|
||||
* is useful here for the Spring Batch project. The code has been altered to better
|
||||
* suite the batch processing requirements.
|
||||
*
|
||||
* @param sql String to search in. Returns 0 if the given String is <code>null</code>.
|
||||
*/
|
||||
public static int countParameterPlaceholders(String sql, List<String> namedParameterHolder ) {
|
||||
if (sql == null) {
|
||||
return 0;
|
||||
}
|
||||
|
||||
char[] statement = sql.toCharArray();
|
||||
boolean withinQuotes = false;
|
||||
Map<String, StringBuilder> namedParameters = new HashMap<String, StringBuilder>();
|
||||
char currentQuote = '-';
|
||||
int parameterCount = 0;
|
||||
int i = 0;
|
||||
while (i < statement.length) {
|
||||
if (withinQuotes) {
|
||||
if (statement[i] == currentQuote) {
|
||||
withinQuotes = false;
|
||||
currentQuote = '-';
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (statement[i] == '"' || statement[i] == '\'') {
|
||||
withinQuotes = true;
|
||||
currentQuote = statement[i];
|
||||
}
|
||||
else {
|
||||
if (statement[i] == ':' || statement[i] == '&') {
|
||||
int j = i + 1;
|
||||
StringBuilder parameter = new StringBuilder();
|
||||
while (j < statement.length && parameterNameContinues(statement, j)) {
|
||||
parameter.append(statement[j]);
|
||||
j++;
|
||||
}
|
||||
if (j - i > 1) {
|
||||
if (!namedParameters.containsKey(parameter.toString())) {
|
||||
parameterCount++;
|
||||
namedParameters.put(parameter.toString(), parameter);
|
||||
i = j - 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
else {
|
||||
if (statement[i] == '?') {
|
||||
parameterCount++;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
i++;
|
||||
}
|
||||
if (namedParameterHolder != null) {
|
||||
namedParameterHolder.addAll(namedParameters.keySet());
|
||||
}
|
||||
return parameterCount;
|
||||
}
|
||||
|
||||
/**
|
||||
* Determine whether a parameter name continues at the current position,
|
||||
* that is, does not end delimited by any whitespace character yet.
|
||||
* @param statement the SQL statement
|
||||
* @param pos the position within the statement
|
||||
*/
|
||||
private static boolean parameterNameContinues(char[] statement, int pos) {
|
||||
return (statement[pos] != ' ' && statement[pos] != ',' && statement[pos] != ')' &&
|
||||
statement[pos] != '"' && statement[pos] != '\'' && statement[pos] != '|' &&
|
||||
statement[pos] != ';' && statement[pos] != '\n' && statement[pos] != '\r');
|
||||
}
|
||||
|
||||
}
|
||||
@@ -40,8 +40,12 @@ public class MySqlPagingQueryProvider extends AbstractSqlPagingQueryProvider {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
sql.append(" LIMIT ").append(pageSize);
|
||||
|
||||
|
||||
@@ -14,8 +14,12 @@ public class OraclePagingQueryProvider extends SqlWindowingPagingQueryProvider {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ROWNUM <= ").append(pageSize);
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append("ROWNUM <= ").append(pageSize);
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
|
||||
return sql.toString();
|
||||
@@ -26,9 +30,13 @@ public class OraclePagingQueryProvider extends SqlWindowingPagingQueryProvider {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" AND ROWNUM <= ").append(pageSize);
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
|
||||
return sql.toString();
|
||||
|
||||
@@ -61,4 +61,17 @@ public interface PagingQueryProvider {
|
||||
*/
|
||||
String generateJumpToItemQuery(int itemIndex, int pageSize);
|
||||
|
||||
/**
|
||||
* The number of parameters that are declared in the query
|
||||
* @return number of parameters
|
||||
*/
|
||||
int getParameterCount();
|
||||
|
||||
/**
|
||||
* Indicate whether the generated queries use named parameter syntax.
|
||||
*
|
||||
* @return true if named parameter syntax is used
|
||||
*/
|
||||
boolean isUsingNamedParameters();
|
||||
|
||||
}
|
||||
|
||||
@@ -25,8 +25,12 @@ public class PostgresPagingQueryProvider extends AbstractSqlPagingQueryProvider
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
sql.append(" LIMIT ").append(pageSize);
|
||||
|
||||
|
||||
@@ -25,8 +25,12 @@ public class SqlServerPagingQueryProvider extends SqlWindowingPagingQueryProvide
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
|
||||
return sql.toString();
|
||||
|
||||
@@ -42,8 +42,13 @@ public class SqlWindowingPagingQueryProvider extends AbstractSqlPagingQueryProvi
|
||||
sql.append("SELECT * FROM ( ");
|
||||
sql.append("SELECT ").append(getSelectClause()).append(", ");
|
||||
sql.append("ROW_NUMBER() OVER (ORDER BY ").append(getSortKey()).append(" ASC) AS ROW_NUMBER");
|
||||
sql.append(" FROM ").append(getFromClause()).append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(") WHERE ROW_NUMBER <= ").append(pageSize);
|
||||
|
||||
return sql.toString();
|
||||
|
||||
@@ -25,8 +25,12 @@ public class SybasePagingQueryProvider extends SqlWindowingPagingQueryProvider {
|
||||
StringBuilder sql = new StringBuilder();
|
||||
sql.append("SELECT ").append("TOP ").append(pageSize).append(" ").append(getSelectClause());
|
||||
sql.append(" FROM ").append(getFromClause());
|
||||
sql.append(" WHERE ").append(getSortKey()).append(" > ?");
|
||||
sql.append(getWhereClause() == null ? "" : " AND " + getWhereClause());
|
||||
sql.append(" WHERE ");
|
||||
if (getWhereClause() != null) {
|
||||
sql.append(getWhereClause());
|
||||
sql.append(" AND ");
|
||||
}
|
||||
sql.append(getSortKey()).append(" > ").append(getSortKeyPlaceHolder());
|
||||
sql.append(" ORDER BY ").append(getSortKey()).append(" ASC");
|
||||
|
||||
return sql.toString();
|
||||
|
||||
Reference in New Issue
Block a user