/*
* 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.subselect;
import java.util.ArrayList;
import java.util.List;
import org.hibernate.Session;
import org.hibernate.dialect.DerbyDialect;
import org.hibernate.dialect.H2Dialect;
import org.hibernate.dialect.SQLServerDialect;
import org.hibernate.dialect.SybaseDialect;
import org.hibernate.testing.SkipForDialect;
import org.hibernate.testing.TestForIssue;
import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase;
import org.junit.Assert;
import org.junit.Test;
/**
* @author Strong Liu <stliu@hibernate.org>
*/
@SkipForDialect(value = H2Dialect.class, comment = "H2 doesn't support this sql syntax")
@SkipForDialect(value = SQLServerDialect.class, comment = "mssql doesn't support multiple columns in the 'where' clause of a 'where in' query")
@SkipForDialect(value = SybaseDialect.class, comment = "sybase doesn't support multiple columns in the 'where' clause of a 'where in' query")
@SkipForDialect(value = DerbyDialect.class, comment = "derby doesn't support multiple columns in the 'where' clause of a 'where in' query")
@TestForIssue( jiraKey = "HHH-8312")
public class CompositeIdTypeBindingTest extends BaseCoreFunctionalTestCase {
@Override
protected Class<?>[] getAnnotatedClasses() {
return new Class[] { Employee.class, EmployeeGroup.class };
}
@Test
public void testCompositeTypeBinding() {
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// prepare test data
Session session = openSession();
session.beginTransaction();
EmployeeGroup employeegroup = new EmployeeGroup( new EmployeeGroupId( "a", "b" ) );
employeegroup.addEmployee( new Employee( "stliu" ) );
employeegroup.addEmployee( new Employee( "david" ) );
session.save( employeegroup );
employeegroup = new EmployeeGroup( new EmployeeGroupId( "c", "d" ) );
employeegroup.addEmployee( new Employee( "gail" ) );
employeegroup.addEmployee( new Employee( "steve" ) );
session.save( employeegroup );
session.getTransaction().commit();
session.close();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// Perform the test
session = openSession();
session.beginTransaction();
List<EmployeeGroupId> parameters = new ArrayList<EmployeeGroupId>();
parameters.add( new EmployeeGroupId( "a", "b" ) );
parameters.add( new EmployeeGroupId( "c", "d" ) );
parameters.add( new EmployeeGroupId( "e", "f" ) );
List result = session.createQuery( "select eg from EmployeeGroup eg where eg.id in (:employeegroupIds)" )
.setParameterList( "employeegroupIds", parameters ).list();
Assert.assertEquals( 2, result.size() );
employeegroup = (EmployeeGroup) result.get( 0 );
Assert.assertEquals( "a", employeegroup.getId().getGroupName() );
Assert.assertNotNull( employeegroup.getEmployees() );
Assert.assertEquals( 2, employeegroup.getEmployees().size() );
session.getTransaction().commit();
session.close();
// ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
// clean up test data
session = openSession();
session.beginTransaction();
List<EmployeeGroup> egs = session.createQuery( "from EmployeeGroup" ).list();
for ( EmployeeGroup eg : egs ) {
eg.getEmployees().clear();
}
session.flush();
session.createQuery( "delete from EmployeeGroup" ).executeUpdate();
session.createQuery( "delete from Employee" ).executeUpdate();
session.getTransaction().commit();
session.close();
}
}