/*
* 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.domain.SqmSingularAttribute;
import org.hibernate.query.sqm.SemanticException;
import org.hibernate.query.sqm.tree.SqmParameter;
import org.hibernate.query.sqm.tree.SqmSelectStatement;
import org.hibernate.sqm.test.domain.StandardModelTest;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.instanceOf;
import static org.hamcrest.CoreMatchers.is;
import static org.hamcrest.MatcherAssert.assertThat;
/**
* @author Steve Ebersole
*/
public class ParameterTests extends StandardModelTest {
@Test( expected = SemanticException.class )
public void testInvalidLegacyPositionalParam() {
// todo : should we define the rule with the integer as optional and then give a better exception?
interpret( "select a.nickName from Person a where a.numberOfToes = ?" );
}
@Test( expected = SemanticException.class )
public void testZeroBasedPositionalParam() {
interpret( "select a.nickName from Person a where a.numberOfToes = ?0" );
}
@Test( expected = SemanticException.class )
public void testNonContiguousPositionalParams() {
interpret( "select a.nickName from Person a where a.numberOfToes = ?1 or a.numberOfToes = ?3" );
}
@Test
public void testParameterCollection() {
final SqmSelectStatement sqm = interpretSelect( "select a.nickName from Person a where a.numberOfToes = ?1" );
assertThat( sqm.getQueryParameters().size(), is(1) );
}
@Test
public void testAnticipatedTypeHandling() {
final SqmSelectStatement sqm = interpretSelect( "select a.nickName from Person a where a.numberOfToes = ?1" );
final SqmParameter parameter = sqm.getQueryParameters().iterator().next();
assertThat( parameter.getAnticipatedType(), is( instanceOf( SqmSingularAttribute.class ) ) );
assertThat( parameter.allowMultiValuedBinding(), is(false) );
}
@Test
public void testAllowMultiValuedBinding() {
final SqmSelectStatement sqm = interpretSelect( "select a.nickName from Person a where a.numberOfToes in (?1)" );
final SqmParameter parameter = sqm.getQueryParameters().iterator().next();
assertThat( parameter.getAnticipatedType(), is( instanceOf( SqmSingularAttribute.class ) ) );
assertThat( parameter.allowMultiValuedBinding(), is(true) );
}
}