/*
* 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.annotations.onetomany;
import java.util.Arrays;
import java.util.Iterator;
import java.util.List;
import org.junit.Assert;
import org.junit.Test;
import org.hibernate.Criteria;
import org.hibernate.Session;
import org.hibernate.cfg.AvailableSettings;
import org.hibernate.cfg.Configuration;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.testing.RequiresDialect;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
/**
* @author Lukasz Antoniak (lukasz dot antoniak at gmail dot com)
*/
@TestForIssue(jiraKey = "HHH-465")
@RequiresDialect(value = H2Dialect.class,
comment = "By default H2 places NULL values first, so testing 'NULLS LAST' expression.")
public class DefaultNullOrderingTest extends BaseCoreFunctionalTestCase {
@Override
protected void configure(Configuration configuration) {
configuration.setProperty( AvailableSettings.DEFAULT_NULL_ORDERING, "last" );
}
@Override
protected Class[] getAnnotatedClasses() {
return new Class[] { Monkey.class, Troop.class, Soldier.class };
}
@Test
public void testHqlDefaultNullOrdering() {
Session session = openSession();
// Populating database with test data.
session.getTransaction().begin();
Monkey monkey1 = new Monkey();
monkey1.setName( null );
Monkey monkey2 = new Monkey();
monkey2.setName( "Warsaw ZOO" );
session.persist( monkey1 );
session.persist( monkey2 );
session.getTransaction().commit();
session.getTransaction().begin();
List<Zoo> orderedResults = (List<Zoo>) session.createQuery( "from Monkey m order by m.name" ).list(); // Should order by NULLS LAST.
Assert.assertEquals( Arrays.asList( monkey2, monkey1 ), orderedResults );
session.getTransaction().commit();
session.clear();
// Cleanup data.
session.getTransaction().begin();
session.delete( monkey1 );
session.delete( monkey2 );
session.getTransaction().commit();
session.close();
}
@Test
public void testAnnotationsDefaultNullOrdering() {
Session session = openSession();
// Populating database with test data.
session.getTransaction().begin();
Troop troop = new Troop();
troop.setName( "Alpha 1" );
Soldier ranger = new Soldier();
ranger.setName( "Ranger 1" );
troop.addSoldier( ranger );
Soldier sniper = new Soldier();
sniper.setName( null );
troop.addSoldier( sniper );
session.persist( troop );
session.getTransaction().commit();
session.clear();
session.getTransaction().begin();
troop = (Troop) session.get( Troop.class, troop.getId() );
Iterator<Soldier> iterator = troop.getSoldiers().iterator(); // Should order by NULLS LAST.
Assert.assertEquals( ranger.getName(), iterator.next().getName() );
Assert.assertNull( iterator.next().getName() );
session.getTransaction().commit();
session.clear();
// Cleanup data.
session.getTransaction().begin();
session.delete( troop );
session.getTransaction().commit();
session.close();
}
@Test
public void testCriteriaDefaultNullOrdering() {
Session session = openSession();
// Populating database with test data.
session.getTransaction().begin();
Monkey monkey1 = new Monkey();
monkey1.setName( null );
Monkey monkey2 = new Monkey();
monkey2.setName( "Berlin ZOO" );
session.persist( monkey1 );
session.persist( monkey2 );
session.getTransaction().commit();
session.getTransaction().begin();
Criteria criteria = session.createCriteria( Monkey.class );
criteria.addOrder( org.hibernate.criterion.Order.asc( "name" ) ); // Should order by NULLS LAST.
Assert.assertEquals( Arrays.asList( monkey2, monkey1 ), criteria.list() );
session.getTransaction().commit();
session.clear();
// Cleanup data.
session.getTransaction().begin();
session.delete( monkey1 );
session.delete( monkey2 );
session.getTransaction().commit();
session.close();
}
}