/*
* 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.orm.persister.common.spi.SingularAttribute;
import org.hibernate.orm.persister.entity.spi.IdentifierDescriptorSimple;
import org.hibernate.query.sqm.tree.SqmSelectStatement;
import org.hibernate.query.sqm.tree.expression.domain.SqmEntityIdentifierReferenceSimple;
import org.hibernate.query.sqm.tree.expression.domain.SqmSingularAttributeReference;
import org.hibernate.sqm.test.domain.StandardModelTest;
import org.junit.Test;
import static org.hamcrest.CoreMatchers.sameInstance;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertThat;
import static org.junit.Assert.assertTrue;
/**
* The Hibernate ORM persisters keep id descriptions specially. Specifically they are
* not part of the grouping of "normal attributes". One ramification of this special
* treatment of 'id' references in sqm. These tests assert that we handle those
* ramifications correctly.
*
* @author Steve Ebersole
*/
public class EntityIdReferenceTest extends StandardModelTest {
@Test
public void testReferenceSimpleIdAttributeNamedId() {
SqmSelectStatement sqm = interpretSelect( "select p.id from Person p" );
SqmEntityIdentifierReferenceSimple idBinding = (SqmEntityIdentifierReferenceSimple) sqm.getQuerySpec().getSelectClause().getSelections().get( 0 ).getExpression();
// assertThat( idReference.getExpressionType().getTypeName(), is(Integer.class.getName() ) );
sqm = (SqmSelectStatement) interpret( "select p.pk from Person p" );
SqmEntityIdentifierReferenceSimple pkReference = (SqmEntityIdentifierReferenceSimple) sqm.getQuerySpec().getSelectClause().getSelections().get( 0 ).getExpression();
// assertThat( pkReference.getExpressionType().getTypeName(), is(Integer.class.getName() ) );
assertThat( idBinding.getReferencedNavigable(), sameInstance( pkReference.getReferencedNavigable() ) );
}
@Test
public void testEntityWithNonIdAttributeNamedId() {
SqmSelectStatement sqm = interpretSelect( "select p.id from EntityWithNonIdAttributeNamedId p" );
SqmSingularAttributeReference idReference = (SqmSingularAttributeReference) sqm.getQuerySpec().getSelectClause().getSelections().get( 0 ).getExpression();
SingularAttribute idOrmSingularAttribute = (SingularAttribute) idReference.getReferencedNavigable();
assertFalse( idOrmSingularAttribute.isId() );
// assertThat( idReference.getExpressionType().getTypeName(), is( String.class.getName() ) );
sqm = interpretSelect( "select p.pk from EntityWithNonIdAttributeNamedId p" );
SqmEntityIdentifierReferenceSimple pkReference = (SqmEntityIdentifierReferenceSimple) sqm.getQuerySpec().getSelectClause().getSelections().get( 0 ).getExpression();
SingularAttribute pkOrmSingularAttribute = ( (IdentifierDescriptorSimple) pkReference.getReferencedNavigable() ).getIdAttribute();
assertTrue( pkOrmSingularAttribute.isId() );
// assertThat( pkReference.getExpressionType().getTypeName(), is( Integer.class.getName() ) );
}
@Test
public void testNonAggregatedCompositeIdReference() {
SqmSelectStatement sqm = interpretSelect( "select e.id from NonAggregatedCompositeIdEntityWithNonIdAttributeNamedId e" );
SqmSingularAttributeReference idReference = (SqmSingularAttributeReference) sqm.getQuerySpec().getSelectClause().getSelections().get( 0 ).getExpression();
SingularAttribute attribute = (SingularAttribute) idReference.getReferencedNavigable();
assertFalse( attribute.isId() );
// assertThat( idReference.getExpressionType().getTypeName(), is(String.class.getName() ) );
}
}