Package org.hibernate.dialect.pagination
Class SQLServer2005LimitHandler
- java.lang.Object
-
- org.hibernate.dialect.pagination.AbstractLimitHandler
-
- org.hibernate.dialect.pagination.SQLServer2005LimitHandler
-
- All Implemented Interfaces:
LimitHandler
- Direct Known Subclasses:
SQLServer2012LimitHandler
public class SQLServer2005LimitHandler extends AbstractLimitHandler
LIMIT clause handler compatible with SQL Server 2005 and later.
-
-
Constructor Summary
Constructors Constructor Description SQLServer2005LimitHandler()Constructs a SQLServer2005LimitHandler
-
Method Summary
All Methods Instance Methods Concrete Methods Modifier and Type Method Description protected voidaddTopExpression(StringBuilder sql, int offset)AddsTOPexpression.intbindLimitParametersAtEndOfQuery(RowSelection selection, PreparedStatement statement, int index)Bind parameter values needed by the LIMIT clause after original SELECT statement.intbindLimitParametersAtStartOfQuery(RowSelection selection, PreparedStatement statement, int index)Bind parameter values needed by the LIMIT clause before original SELECT statement.intconvertToFirstRowValue(int zeroBasedFirstResult)Hibernate APIs explicitly state that setFirstResult() should be a zero-based offset.protected voidencloseWithOuterQuery(StringBuilder sql, int offset)Encloses original SQL statement with outer query that provides __row__ column.protected StringfillAliasInSelectClause(StringBuilder sb, int offset)Adds missing aliases in provided SELECT clause and returns coma-separated list of them.StringprocessSql(String sql, RowSelection selection)Add a LIMIT clause to the given SQL SELECT (HHH-2655: ROW_NUMBER for Paging) The LIMIT SQL will look like:booleansupportsLimit()Does this handler support some form of limiting query results via a SQL clause?booleansupportsLimitOffset()Does this handler's LIMIT support (if any) additionally support specifying an offset?booleansupportsVariableLimit()Does this handler support bind variables (i.e., prepared statement parameters) for its limit/offset?booleanuseMaxForLimit()Does the LIMIT clause take a "maximum" row number instead of a total number of returned rows?-
Methods inherited from class org.hibernate.dialect.pagination.AbstractLimitHandler
bindLimitParameters, bindLimitParametersFirst, bindLimitParametersInReverseOrder, forceLimitUsage, getMaxOrLimit, setMaxRows
-
Methods inherited from class java.lang.Object
clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait
-
Methods inherited from interface org.hibernate.dialect.pagination.LimitHandler
processSql
-
-
-
-
Method Detail
-
supportsLimit
public boolean supportsLimit()
Description copied from interface:LimitHandlerDoes this handler support some form of limiting query results via a SQL clause?- Specified by:
supportsLimitin interfaceLimitHandler- Overrides:
supportsLimitin classAbstractLimitHandler- Returns:
- True if this handler supports some form of LIMIT.
-
useMaxForLimit
public boolean useMaxForLimit()
Description copied from class:AbstractLimitHandlerDoes the LIMIT clause take a "maximum" row number instead of a total number of returned rows? This is easiest understood via an example. Consider you have a table with 20 rows, but you only want to retrieve rows number 11 through 20. Generally, a limit with offset would say that the offset = 11 and the limit = 10 (we only want 10 rows at a time); this is specifying the total number of returned rows. Some dialects require that we instead specify offset = 11 and limit = 20, where 20 is the "last" row we want relative to offset (i.e. total number of rows = 20 - 11 = 9) So essentially, is limit relative from offset? Or is limit absolute?- Overrides:
useMaxForLimitin classAbstractLimitHandler- Returns:
- True if limit is relative from offset; false otherwise.
-
supportsLimitOffset
public boolean supportsLimitOffset()
Description copied from interface:LimitHandlerDoes this handler's LIMIT support (if any) additionally support specifying an offset?- Specified by:
supportsLimitOffsetin interfaceLimitHandler- Overrides:
supportsLimitOffsetin classAbstractLimitHandler- Returns:
- True if the handler supports an offset within the limit support.
-
supportsVariableLimit
public boolean supportsVariableLimit()
Description copied from class:AbstractLimitHandlerDoes this handler support bind variables (i.e., prepared statement parameters) for its limit/offset?- Overrides:
supportsVariableLimitin classAbstractLimitHandler- Returns:
- True if bind variables can be used; false otherwise.
-
convertToFirstRowValue
public int convertToFirstRowValue(int zeroBasedFirstResult)
Description copied from class:AbstractLimitHandlerHibernate APIs explicitly state that setFirstResult() should be a zero-based offset. Here we allow the Dialect a chance to convert that value based on what the underlying db or driver will expect. NOTE: what gets passed intoAbstractLimitHandler.processSql(String, org.hibernate.engine.spi.RowSelection)is the zero-based offset. Dialects which do notAbstractLimitHandler.supportsVariableLimit()should take care to perform any needed first-row-conversion calls prior to injecting the limit values into the SQL string.- Overrides:
convertToFirstRowValuein classAbstractLimitHandler- Parameters:
zeroBasedFirstResult- The user-supplied, zero-based first row offset.- Returns:
- The corresponding db/dialect specific offset.
- See Also:
Query.setFirstResult(int),Criteria.setFirstResult(int)
-
processSql
public String processSql(String sql, RowSelection selection)
Add a LIMIT clause to the given SQL SELECT (HHH-2655: ROW_NUMBER for Paging) The LIMIT SQL will look like:WITH query AS ( SELECT inner_query.* , ROW_NUMBER() OVER (ORDER BY CURRENT_TIMESTAMP) as __row__ FROM ( original_query_with_top_if_order_by_present_and_all_aliased_columns ) inner_query ) SELECT alias_list FROM query WHERE __row__ >= offset AND __row__ < offset + lastWhen offset equals 0, onlyTOP(?)expression is added to the original query.- Specified by:
processSqlin interfaceLimitHandler- Overrides:
processSqlin classAbstractLimitHandler- Parameters:
sql- the SQL query to process.selection- the selection criteria for rows.- Returns:
- A new SQL statement with the LIMIT clause applied.
-
bindLimitParametersAtStartOfQuery
public int bindLimitParametersAtStartOfQuery(RowSelection selection, PreparedStatement statement, int index) throws SQLException
Description copied from interface:LimitHandlerBind parameter values needed by the LIMIT clause before original SELECT statement.- Specified by:
bindLimitParametersAtStartOfQueryin interfaceLimitHandler- Overrides:
bindLimitParametersAtStartOfQueryin classAbstractLimitHandler- Parameters:
selection- the selection criteria for rows.statement- Statement to which to bind limit parameter values.index- Index from which to start binding.- Returns:
- The number of parameter values bound.
- Throws:
SQLException- Indicates problems binding parameter values.
-
bindLimitParametersAtEndOfQuery
public int bindLimitParametersAtEndOfQuery(RowSelection selection, PreparedStatement statement, int index) throws SQLException
Description copied from interface:LimitHandlerBind parameter values needed by the LIMIT clause after original SELECT statement.- Specified by:
bindLimitParametersAtEndOfQueryin interfaceLimitHandler- Overrides:
bindLimitParametersAtEndOfQueryin classAbstractLimitHandler- Parameters:
selection- the selection criteria for rows.statement- Statement to which to bind limit parameter values.index- Index from which to start binding.- Returns:
- The number of parameter values bound.
- Throws:
SQLException- Indicates problems binding parameter values.
-
fillAliasInSelectClause
protected String fillAliasInSelectClause(StringBuilder sb, int offset)
Adds missing aliases in provided SELECT clause and returns coma-separated list of them. If query takes advantage of expressions like * or {table}.* inside SELECT clause, method returns *.- Parameters:
sb- SQL query.offset- the starting offset.- Returns:
- List of aliases separated with comas or *.
-
encloseWithOuterQuery
protected void encloseWithOuterQuery(StringBuilder sql, int offset)
Encloses original SQL statement with outer query that provides __row__ column.- Parameters:
sql- SQL query.offset- SQL query offset.
-
addTopExpression
protected void addTopExpression(StringBuilder sql, int offset)
AddsTOPexpression. Parameter value is bind inbindLimitParametersAtStartOfQuery(RowSelection, PreparedStatement, int)method.- Parameters:
sql- SQL query.offset- the offset where top expression pattern matching should begin.
-
-