HHH-12537: Query hint test for SAP HANA
- add org.hibernate.test.queryhint.QueryHintHANATest
This commit is contained in:
parent
1651c804fb
commit
8fcdbb35e6
|
@ -0,0 +1,198 @@
|
|||
/*
|
||||
* Hibernate, Relational Persistence for Idiomatic Java
|
||||
*
|
||||
* License: GNU Lesser General Public License (LGPL), version 2.1 or later.
|
||||
* See the lgpl.txt file in the root directory or <http://www.gnu.org/licenses/lgpl-2.1.html>.
|
||||
*/
|
||||
package org.hibernate.test.queryhint;
|
||||
|
||||
import static org.hamcrest.CoreMatchers.containsString;
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInHibernate;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
import static org.junit.Assert.assertThat;
|
||||
|
||||
import java.util.List;
|
||||
import java.util.Map;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.FetchType;
|
||||
import javax.persistence.GeneratedValue;
|
||||
import javax.persistence.Id;
|
||||
import javax.persistence.ManyToOne;
|
||||
|
||||
import org.hibernate.Criteria;
|
||||
import org.hibernate.cfg.AvailableSettings;
|
||||
import org.hibernate.criterion.Restrictions;
|
||||
import org.hibernate.dialect.AbstractHANADialect;
|
||||
import org.hibernate.engine.spi.SessionFactoryImplementor;
|
||||
import org.hibernate.query.Query;
|
||||
import org.hibernate.test.util.jdbc.PreparedStatementSpyConnectionProvider;
|
||||
import org.hibernate.testing.RequiresDialect;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
/**
|
||||
* @author Jonathan Bregler
|
||||
*/
|
||||
@RequiresDialect(AbstractHANADialect.class)
|
||||
public class QueryHintHANATest extends BaseNonConfigCoreFunctionalTestCase {
|
||||
|
||||
private PreparedStatementSpyConnectionProvider connectionProvider;
|
||||
|
||||
@Override
|
||||
protected void addSettings(Map settings) {
|
||||
settings.put( AvailableSettings.USE_SQL_COMMENTS, "true" );
|
||||
settings.put(
|
||||
org.hibernate.cfg.AvailableSettings.CONNECTION_PROVIDER,
|
||||
connectionProvider );
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void buildResources() {
|
||||
connectionProvider = new PreparedStatementSpyConnectionProvider( false, false );
|
||||
super.buildResources();
|
||||
}
|
||||
|
||||
@Override
|
||||
public void releaseResources() {
|
||||
super.releaseResources();
|
||||
connectionProvider.stop();
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[]{ Employee.class, Department.class };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected void afterSessionFactoryBuilt(SessionFactoryImplementor sessionFactory) {
|
||||
Department department = new Department();
|
||||
department.name = "Sales";
|
||||
Employee employee1 = new Employee();
|
||||
employee1.department = department;
|
||||
Employee employee2 = new Employee();
|
||||
employee2.department = department;
|
||||
|
||||
doInHibernate( this::sessionFactory, s -> {
|
||||
s.persist( department );
|
||||
s.persist( employee1 );
|
||||
s.persist( employee2 );
|
||||
} );
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testQueryHint() {
|
||||
|
||||
connectionProvider.clear();
|
||||
|
||||
doInHibernate( this::sessionFactory, s -> {
|
||||
Query<Employee> query = s.createQuery( "FROM QueryHintHANATest$Employee e WHERE e.department.name = :departmentName", Employee.class )
|
||||
.addQueryHint( "NO_CS_JOIN" )
|
||||
.setParameter( "departmentName", "Sales" );
|
||||
List<Employee> results = query.list();
|
||||
|
||||
assertEquals( results.size(), 2 );
|
||||
} );
|
||||
|
||||
assertEquals(
|
||||
1,
|
||||
connectionProvider.getPreparedStatements().size() );
|
||||
assertThat( connectionProvider.getPreparedSQLStatements().get( 0 ), containsString( " with hint (NO_CS_JOIN)" ) );
|
||||
connectionProvider.clear();
|
||||
|
||||
// test multiple hints
|
||||
doInHibernate( this::sessionFactory, s -> {
|
||||
Query<Employee> query = s.createQuery( "FROM QueryHintHANATest$Employee e WHERE e.department.name = :departmentName", Employee.class )
|
||||
.addQueryHint( "NO_CS_JOIN" )
|
||||
.addQueryHint( "OPTIMIZE_METAMODEL" )
|
||||
.setParameter( "departmentName", "Sales" );
|
||||
List<Employee> results = query.list();
|
||||
|
||||
assertEquals( results.size(), 2 );
|
||||
} );
|
||||
|
||||
assertEquals(
|
||||
1,
|
||||
connectionProvider.getPreparedStatements().size() );
|
||||
assertThat( connectionProvider.getPreparedSQLStatements().get( 0 ), containsString( " with hint (NO_CS_JOIN,OPTIMIZE_METAMODEL)" ) );
|
||||
connectionProvider.clear();
|
||||
|
||||
// ensure the insertion logic can handle a comment appended to the front
|
||||
doInHibernate( this::sessionFactory, s -> {
|
||||
Query<Employee> query = s.createQuery( "FROM QueryHintHANATest$Employee e WHERE e.department.name = :departmentName", Employee.class )
|
||||
.setComment( "this is a test" )
|
||||
.addQueryHint( "NO_CS_JOIN" )
|
||||
.setParameter( "departmentName", "Sales" );
|
||||
List<Employee> results = query.list();
|
||||
|
||||
assertEquals( results.size(), 2 );
|
||||
} );
|
||||
|
||||
assertEquals(
|
||||
1,
|
||||
connectionProvider.getPreparedStatements().size() );
|
||||
assertThat( connectionProvider.getPreparedSQLStatements().get( 0 ), containsString( " with hint (NO_CS_JOIN)" ) );
|
||||
connectionProvider.clear();
|
||||
|
||||
// test Criteria
|
||||
doInHibernate( this::sessionFactory, s -> {
|
||||
Criteria criteria = s.createCriteria( Employee.class )
|
||||
.addQueryHint( "NO_CS_JOIN" )
|
||||
.createCriteria( "department" ).add( Restrictions.eq( "name", "Sales" ) );
|
||||
List<?> results = criteria.list();
|
||||
|
||||
assertEquals( results.size(), 2 );
|
||||
} );
|
||||
|
||||
assertEquals(
|
||||
1,
|
||||
connectionProvider.getPreparedStatements().size() );
|
||||
assertThat( connectionProvider.getPreparedSQLStatements().get( 0 ), containsString( " with hint (NO_CS_JOIN)" ) );
|
||||
connectionProvider.clear();
|
||||
}
|
||||
|
||||
@Test
|
||||
@TestForIssue(jiraKey = "HHH-12362")
|
||||
public void testQueryHintAndComment() {
|
||||
connectionProvider.clear();
|
||||
|
||||
doInHibernate( this::sessionFactory, s -> {
|
||||
Query<Employee> query = s.createQuery( "FROM QueryHintHANATest$Employee e WHERE e.department.name = :departmentName", Employee.class )
|
||||
.addQueryHint( "NO_CS_JOIN" )
|
||||
.setComment( "My_Query" )
|
||||
.setParameter( "departmentName", "Sales" );
|
||||
List<Employee> results = query.list();
|
||||
|
||||
assertEquals( results.size(), 2 );
|
||||
} );
|
||||
|
||||
assertEquals(
|
||||
1,
|
||||
connectionProvider.getPreparedStatements().size() );
|
||||
assertThat( connectionProvider.getPreparedSQLStatements().get( 0 ), containsString( " with hint (NO_CS_JOIN)" ) );
|
||||
assertThat( connectionProvider.getPreparedSQLStatements().get( 0 ), containsString( "/* My_Query */ select" ) );
|
||||
connectionProvider.clear();
|
||||
}
|
||||
|
||||
@Entity
|
||||
public static class Employee {
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
public long id;
|
||||
|
||||
@ManyToOne(fetch = FetchType.LAZY)
|
||||
public Department department;
|
||||
}
|
||||
|
||||
@Entity
|
||||
public static class Department {
|
||||
|
||||
@Id
|
||||
@GeneratedValue
|
||||
public long id;
|
||||
|
||||
public String name;
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue