/* * Hibernate, Relational Persistence for Idiomatic Java * * License: Apache License, Version 2.0 * See the LICENSE file in the root directory or visit http://www.apache.org/licenses/LICENSE-2.0 */ package org.hibernate.sqm.test.hql; import org.hibernate.query.sqm.tree.SqmSelectStatement; import org.hibernate.query.sqm.tree.expression.LiteralIntegerSqmExpression; import org.hibernate.query.sqm.tree.expression.ParameterSqmExpression; import org.hibernate.query.sqm.tree.expression.SqmExpression; import org.hibernate.query.sqm.tree.expression.SubQuerySqmExpression; import org.hibernate.query.sqm.tree.expression.domain.SqmSingularAttributeReference; import org.hibernate.query.sqm.tree.predicate.RelationalSqmPredicate; import org.hibernate.sqm.test.domain.StandardModelTest; import org.junit.Rule; import org.junit.Test; import org.junit.rules.ExpectedException; import static org.hamcrest.CoreMatchers.instanceOf; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertThat; /** * Test various forms of selections * * @author Christian Beikov */ public class LimitOffsetClauseTests extends StandardModelTest { @Rule public ExpectedException expectedException = ExpectedException.none(); @Test public void testSimpleLimit() { SqmSelectStatement statement = interpretSelect( "select p from Person p limit 1" ); SqmExpression limitExpression = statement.getQuerySpec().getLimitOffsetClause().getLimitExpression(); assertThat( limitExpression, instanceOf( LiteralIntegerSqmExpression.class ) ); assertEquals( Integer.valueOf( 1 ), LiteralIntegerSqmExpression.class.cast( limitExpression ).getLiteralValue() ); } @Test public void testParameterOffset() { SqmSelectStatement statement = interpretSelect( "select p from Person p offset :param" ); SqmExpression offsetExpression = statement.getQuerySpec().getLimitOffsetClause().getOffsetExpression(); assertThat( offsetExpression, instanceOf( ParameterSqmExpression.class ) ); assertEquals( "param", ParameterSqmExpression.class.cast( offsetExpression ).getName() ); } @Test public void testSubqueryLimitOffset() { SqmSelectStatement statement = interpretSelect( "select p from Person p where p.nickName = ( select pSub.nickName from Person pSub order by pSub.numberOfToes limit 1 )" ); RelationalSqmPredicate predicate = (RelationalSqmPredicate) statement.getQuerySpec().getWhereClause().getPredicate(); SubQuerySqmExpression subQuery = (SubQuerySqmExpression) predicate.getRightHandExpression(); SqmExpression sortExpression = subQuery.getQuerySpec().getOrderByClause().getSortSpecifications().get( 0 ).getSortExpression(); assertEquals( "numberOfToes", SqmSingularAttributeReference.class.cast( sortExpression ).getReferencedNavigable().getAttributeName() ); assertEquals( Integer.valueOf( 1 ), LiteralIntegerSqmExpression.class.cast( subQuery.getQuerySpec().getLimitOffsetClause().getLimitExpression() ).getLiteralValue() ); } }