HHH-11642 - Added test case.
This commit is contained in:
parent
a1bc31b126
commit
fe0030c019
|
@ -0,0 +1,107 @@
|
|||
/*
|
||||
* 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.dialect.functional;
|
||||
|
||||
import java.io.Serializable;
|
||||
import java.util.Arrays;
|
||||
import java.util.List;
|
||||
import java.util.stream.Collectors;
|
||||
|
||||
import javax.persistence.Entity;
|
||||
import javax.persistence.Id;
|
||||
|
||||
import org.hibernate.dialect.Dialect;
|
||||
import org.hibernate.dialect.SQLServerDialect;
|
||||
import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase;
|
||||
import org.junit.Test;
|
||||
|
||||
import org.hibernate.testing.RequiresDialect;
|
||||
import org.hibernate.testing.TestForIssue;
|
||||
|
||||
import static org.hibernate.testing.transaction.TransactionUtil.doInJPA;
|
||||
import static org.junit.Assert.assertEquals;
|
||||
|
||||
/**
|
||||
* Test pagination on newer SQL Server Dialects where the application explicitly specifies
|
||||
* the legacy {@code SQLServerDialect} instead and will fail on pagination queries.
|
||||
*
|
||||
* @author Chris Cranford
|
||||
*/
|
||||
@TestForIssue(jiraKey = "HHH-11642")
|
||||
@RequiresDialect(SQLServerDialect.class)
|
||||
public class SQLServerDialectPaginationTest extends BaseEntityManagerFunctionalTestCase {
|
||||
@Override
|
||||
protected Class<?>[] getAnnotatedClasses() {
|
||||
return new Class<?>[] { SimpleEntity.class };
|
||||
}
|
||||
|
||||
@Override
|
||||
protected Dialect getDialect() {
|
||||
// if the environment is any version of SQLServerDialect, force the legacy SQLServerDialect instead
|
||||
// This is so that the legacy's TopLimitHandler will be used here to test the fix necessary when a
|
||||
// user explicitly configures the legacy dialect but uses a more modern version of SQL Server.
|
||||
final Dialect environmentDialect = super.getDialect();
|
||||
if ( environmentDialect instanceof SQLServerDialect ) {
|
||||
return new SQLServerDialect();
|
||||
}
|
||||
return environmentDialect;
|
||||
}
|
||||
|
||||
@Test
|
||||
public void testPaginationQuery() {
|
||||
// prepare some test data
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
for ( int i = 1; i <= 20; ++i ) {
|
||||
final SimpleEntity entity = new SimpleEntity( i, "Entity" + i );
|
||||
entityManager.persist( entity );
|
||||
}
|
||||
} );
|
||||
|
||||
// This would fail with "index 2 out of range" within TopLimitHandler
|
||||
// The fix addresses this problem which only occurs when using SQLServerDialect explicitly.
|
||||
doInJPA( this::entityManagerFactory, entityManager -> {
|
||||
List<SimpleEntity> results = entityManager
|
||||
.createQuery( "SELECT o FROM SimpleEntity o WHERE o.id >= :firstId ORDER BY o.id", SimpleEntity.class )
|
||||
.setParameter( "firstId", 10 )
|
||||
.setMaxResults( 5 )
|
||||
.getResultList();
|
||||
// verify that the paginated query returned the right ids.
|
||||
final List<Integer> ids = results.stream().map( SimpleEntity::getId ).collect( Collectors.toList() );
|
||||
assertEquals( Arrays.asList( 10, 11, 12, 13, 14 ), ids );
|
||||
} );
|
||||
}
|
||||
|
||||
@Entity(name = "SimpleEntity")
|
||||
public static class SimpleEntity implements Serializable {
|
||||
@Id
|
||||
private Integer id;
|
||||
private String name;
|
||||
|
||||
SimpleEntity() {}
|
||||
|
||||
SimpleEntity(Integer id, String name) {
|
||||
this.id = id;
|
||||
this.name = name;
|
||||
}
|
||||
|
||||
public Integer getId() {
|
||||
return id;
|
||||
}
|
||||
|
||||
public void setId(Integer id) {
|
||||
this.id = id;
|
||||
}
|
||||
|
||||
public String getName() {
|
||||
return name;
|
||||
}
|
||||
|
||||
public void setName(String name) {
|
||||
this.name = name;
|
||||
}
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue