Class AbstractLimitHandler
java.lang.Object
org.hibernate.dialect.pagination.spi.AbstractLimitHandler
- All Implemented Interfaces:
LimitHandler
- Direct Known Subclasses:
AbstractNoOffsetLimitHandler, AbstractSimpleLimitHandler, LegacyDB2LimitHandler, NoopLimitHandler, OffsetFetchLimitHandler, Oracle12LimitHandler
@SPI({USE,IMPLEMENT})
public abstract class AbstractLimitHandler
extends Object
implements LimitHandler
Default implementation of
LimitHandler interface.- Since:
- 8.0
-
Field Summary
Fields -
Constructor Summary
Constructors -
Method Summary
Modifier and TypeMethodDescriptionbooleanDoes the offset/limit clause come at the start of theSELECTstatement, or at the end of the query?booleanUsually, the offset comes before the limit, but occasionally the offset is specified after the limit.intconvertToFirstRowValue(int zeroBasedFirstResult) The API methodQuery.setFirstResult(int)accepts a zero-based offset.booleanGenerally, if there is no limit applied to a Hibernate query we do not apply any limits to the SQL query.protected final intgetFirstRow(PaginationRequest request) Retrieve the indicated first row for paginationprotected PatternThe offset/limit clauses typically must come before theFOR UPDATEish clauses, so we need a way to identify these clauses in the text of the whole query.protected final intgetMaxOrLimit(PaginationRequest request) Some dialect-specific LIMIT clauses require the maximum last row number (aka, first_row_number + total_row_count), while others require the maximum returned row count (the total maximum number of rows to return).static booleanhasFirstRow(PaginationRequest request) Is a first row limit indicated?static booleanhasMaxRows(PaginationRequest request) Is a max row limit indicated?protected static StringinsertAfterDistinct(String limitOffsetClause, String sqlStatement) Insert a fragment of SQL right afterSELECT,SELECT DISTINCT, orSELECT ALL.protected static StringinsertAfterSelect(String limitOffsetClause, String sqlStatement) Insert a fragment of SQL right afterSELECT, but beforeDISTINCTorALL.protected StringinsertAtEnd(String limitOffsetClause, String sqlStatement) Insert a fragment of SQL right at the very end of the query.protected StringinsertBeforeForUpdate(String limitOffsetClause, String sqlStatement) Insert a fragment of SQL right before theFOR UPDATEish clauses at the end of the query.protected PaginationJdbcInstructionsjdbcInstructions(PaginationRequest request) protected IntegerjdbcMaxRows(PaginationRequest request) intparameterPositionStart(PaginationRequest request) Determine the one-based position of the first original query parameter after any pagination parameters inserted at the beginning of the SQL.processSql(PaginationRequest request) Apply pagination to a complete SQL string.protected final PaginationResultresult(PaginationRequest request, String sql) protected introwsToSkip(PaginationRequest request) booleanDoes this handler support limiting query results?booleanDoes this handler support combinations of limit and offset?booleanDoes this handler support offsetting query results without also specifying a limit?booleanDoes this handler support bind variables (JDBC prepared statement parameters) for its limit/offset?booleanDoes the limit clause expect the number of the last row, or the "page size", the maximum number of rows we want to receive? Hibernate'sQuery.setMaxResults(int)accepts the page size, so the number of the last row is obtained by adding the number of the first row, which is one greater thanQuery.setFirstResult(int).
-
Field Details
-
NO_LIMIT
-
-
Constructor Details
-
AbstractLimitHandler
-
-
Method Details
-
supportsLimit
public boolean supportsLimit()Description copied from interface:LimitHandlerDoes this handler support limiting query results?- Specified by:
supportsLimitin interfaceLimitHandler- Returns:
- True if this handler supports limit alone.
-
supportsOffset
public boolean supportsOffset()Description copied from interface:LimitHandlerDoes this handler support offsetting query results without also specifying a limit?- Specified by:
supportsOffsetin interfaceLimitHandler- Returns:
- True if this handler supports offset alone.
-
supportsLimitOffset
public boolean supportsLimitOffset()Description copied from interface:LimitHandlerDoes this handler support combinations of limit and offset?- Specified by:
supportsLimitOffsetin interfaceLimitHandler- Returns:
- True if the handler supports an offset within the limit support.
-
supportsVariableLimit
public boolean supportsVariableLimit()Does this handler support bind variables (JDBC prepared statement parameters) for its limit/offset?- Returns:
- true if bind variables can be used
-
bindLimitParametersInReverseOrder
public boolean bindLimitParametersInReverseOrder()Usually, the offset comes before the limit, but occasionally the offset is specified after the limit. Does this dialect require us to bind the parameters in reverse order?- Returns:
- true if the correct order is limit then offset
-
bindLimitParametersFirst
public boolean bindLimitParametersFirst()Does the offset/limit clause come at the start of theSELECTstatement, or at the end of the query?- Returns:
- true if limit parameters come before other parameters
-
useMaxForLimit
public boolean useMaxForLimit()Does the limit clause expect the number of the last row, or the "page size", the maximum number of rows we want to receive? Hibernate'sQuery.setMaxResults(int)accepts the page size, so the number of the last row is obtained by adding the number of the first row, which is one greater thanQuery.setFirstResult(int).- Returns:
- true if the limit clause expects the number of the last row, false if it expects the page size
-
forceLimitUsage
public boolean forceLimitUsage()Generally, if there is no limit applied to a Hibernate query we do not apply any limits to the SQL query. This option forces that the limit be written to the SQL query.- Returns:
- true to force limit into SQL query even if none specified in Hibernate query; false otherwise.
-
convertToFirstRowValue
public int convertToFirstRowValue(int zeroBasedFirstResult) The API methodQuery.setFirstResult(int)accepts a zero-based offset. Does this dialect require a one-based offset to be specified in the offset clause?- Parameters:
zeroBasedFirstResult- The user-supplied, zero-based first row offset.- Returns:
- The resulting offset, adjusted to one-based if necessary.
- Implementation Note:
- The value passed into
processSql(PaginationRequest)has a zero-based offset. Handlers which do notsupportsVariableLimit()should take care to perform any needed first-row-conversion calls prior to injecting the limit values into the SQL string.
-
processSql
Description copied from interface:LimitHandlerApply pagination to a complete SQL string.
Return
PaginationResult.unchanged(String)when the request needs no SQL or JDBC pagination. The returned JDBC instructions must describe every pagination parameter introduced by the rewritten SQL.- Specified by:
processSqlin interfaceLimitHandler- Parameters:
request- immutable completed-SQL pagination input- Returns:
- rewritten SQL and the JDBC work needed to execute it
-
result
-
jdbcInstructions
-
jdbcMaxRows
-
rowsToSkip
-
parameterPositionStart
Description copied from interface:LimitHandlerDetermine the one-based position of the first original query parameter after any pagination parameters inserted at the beginning of the SQL.
This method must agree with
PaginationJdbcInstructions.parametersAtStartreturned byLimitHandler.processSql(PaginationRequest)and must not mutate this handler.- Specified by:
parameterPositionStartin interfaceLimitHandler
-
bindLimitParameterValues
-
hasMaxRows
Is a max row limit indicated?- Parameters:
request- the immutable pagination request- Returns:
- Whether a max row limit was indicated
-
hasFirstRow
Is a first row limit indicated?- Parameters:
request- the immutable pagination request- Returns:
- Whether a first row limit was indicated
-
getMaxOrLimit
Some dialect-specific LIMIT clauses require the maximum last row number (aka, first_row_number + total_row_count), while others require the maximum returned row count (the total maximum number of rows to return).- Parameters:
request- the immutable pagination request- Returns:
- The appropriate value to bind into the limit clause.
-
getFirstRow
Retrieve the indicated first row for pagination- Parameters:
request- the immutable pagination request- Returns:
- The first row
-
insertAfterSelect
-
insertAfterDistinct
-
insertAtEnd
-
getForUpdatePattern
The offset/limit clauses typically must come before theFOR UPDATEish clauses, so we need a way to identify these clauses in the text of the whole query. -
insertBeforeForUpdate
-