HHH-17779 support for key-based pagination
This commit is contained in:
parent
32bd334298
commit
5af80551ad
|
@ -155,6 +155,7 @@ abstract class AbstractSqmSelectionQuery<R> extends AbstractSelectionQuery<R> {
|
||||||
private void addRestrictions(List<Order<? super R>> keyDefinition, List<Comparable<?>> keyValues) {
|
private void addRestrictions(List<Order<? super R>> keyDefinition, List<Comparable<?>> keyValues) {
|
||||||
SqmSelectStatement<R> sqm = getSqmSelectStatement();
|
SqmSelectStatement<R> sqm = getSqmSelectStatement();
|
||||||
sqm = sqm.copy( noParamCopyContext() );
|
sqm = sqm.copy( noParamCopyContext() );
|
||||||
|
final NodeBuilder builder = sqm.nodeBuilder();
|
||||||
final SqmQuerySpec<R> querySpec = sqm.getQuerySpec();
|
final SqmQuerySpec<R> querySpec = sqm.getQuerySpec();
|
||||||
final SqmWhereClause whereClause = querySpec.getWhereClause();
|
final SqmWhereClause whereClause = querySpec.getWhereClause();
|
||||||
final List<? extends JpaSelection<?>> items = querySpec.getSelectClause().getSelectionItems();
|
final List<? extends JpaSelection<?>> items = querySpec.getSelectClause().getSelectionItems();
|
||||||
|
@ -166,7 +167,8 @@ abstract class AbstractSqmSelectionQuery<R> extends AbstractSelectionQuery<R> {
|
||||||
whereClause.applyPredicate( keyPredicate(
|
whereClause.applyPredicate( keyPredicate(
|
||||||
(SqmFrom<?,?>) selected,
|
(SqmFrom<?,?>) selected,
|
||||||
keyDefinition.get(i),
|
keyDefinition.get(i),
|
||||||
(Comparable) keyValues.get(i))
|
(Comparable) keyValues.get(i),
|
||||||
|
builder)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
@ -184,17 +186,21 @@ abstract class AbstractSqmSelectionQuery<R> extends AbstractSelectionQuery<R> {
|
||||||
}
|
}
|
||||||
|
|
||||||
private <C extends Comparable<? super C>> SqmPredicate keyPredicate(
|
private <C extends Comparable<? super C>> SqmPredicate keyPredicate(
|
||||||
SqmFrom<?, ?> selected, Order<? super R> key, C keyValue) {
|
SqmFrom<?, ?> selected, Order<? super R> key, C keyValue, NodeBuilder builder) {
|
||||||
if ( !key.getEntityClass().isAssignableFrom( selected.getJavaType() ) ) {
|
if ( !key.getEntityClass().isAssignableFrom( selected.getJavaType() ) ) {
|
||||||
throw new IllegalQueryOperationException("Select item was of wrong entity type");
|
throw new IllegalQueryOperationException("Select item was of wrong entity type");
|
||||||
}
|
}
|
||||||
final Expression<? extends C> path = selected.get( key.getAttributeName() );
|
final Expression<? extends C> path = selected.get( key.getAttributeName() );
|
||||||
final NodeBuilder builder = getSqmStatement().nodeBuilder();
|
// TODO: use a parameter here and create a binding for it
|
||||||
|
// @SuppressWarnings("unchecked")
|
||||||
|
// final Class<C> valueClass = (Class<C>) keyValue.getClass();
|
||||||
|
// final JpaParameterExpression<C> parameter = builder.parameter(valueClass);
|
||||||
|
// setParameter( parameter, keyValue );
|
||||||
switch ( key.getDirection() ) {
|
switch ( key.getDirection() ) {
|
||||||
case ASCENDING:
|
case ASCENDING:
|
||||||
return builder.greaterThan( path, keyValue);
|
return builder.greaterThan( path, builder.literal(keyValue) );
|
||||||
case DESCENDING:
|
case DESCENDING:
|
||||||
return builder.lessThan( path, keyValue);
|
return builder.lessThan( path, builder.literal(keyValue) );
|
||||||
default:
|
default:
|
||||||
throw new AssertionFailure("Unrecognized key direction");
|
throw new AssertionFailure("Unrecognized key direction");
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in New Issue