/* * 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.criteria.many_to_many; import java.util.LinkedHashSet; import java.util.List; import java.util.Set; import org.hibernate.Criteria; import org.hibernate.Session; import org.hibernate.Transaction; import org.hibernate.criterion.Restrictions; import org.hibernate.sql.JoinType; import org.hibernate.testing.junit4.BaseNonConfigCoreFunctionalTestCase; import org.junit.Test; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; /** * @author Janario Oliveira */ public class CriteriaManyToManyTest extends BaseNonConfigCoreFunctionalTestCase { private Seller[] persist(String prefix) { Session session = openSession(); Transaction tx = session.beginTransaction(); Seller seller1 = new Seller( prefix + "-seller1" ); Seller seller2 = new Seller( prefix + "-seller2" ); Customer customer1 = new Customer( prefix + "-customer1" ); Customer customer2 = new Customer( prefix + "-customer2" ); Customer customer3 = new Customer( prefix + "-customer3" ); seller1.addCustomer( customer1 ); seller1.addCustomer( customer2 ); seller2.addCustomer( customer2 ); seller2.addCustomer( customer3 ); session.persist( customer1 ); session.persist( customer2 ); session.persist( customer3 ); session.persist( seller1 ); session.persist( seller2 ); tx.commit(); session.close(); return new Seller[] {seller1, seller2}; } @Test public void testJoinTable() { Seller[] sellers = persist( "join-table" ); Seller seller1 = sellers[0]; Seller seller2 = sellers[1]; Session session = openSession(); Criteria criteria = session.createCriteria( Seller.class, "s" ); criteria.createCriteria( "s.soldTo", "c", JoinType.INNER_JOIN, Restrictions.eq( "name", "join-table-customer1" ) ); criteria.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY ); @SuppressWarnings("unchecked") List<Seller> results = criteria.list(); assertTrue( results.size() == 1 ); assertTrue( results.contains( seller1 ) ); assertFalse( results.contains( seller2 ) ); criteria = session.createCriteria( Seller.class, "s" ); criteria.createCriteria( "s.soldTo", "c", JoinType.INNER_JOIN, Restrictions.eq( "name", "join-table-customer2" ) ); criteria.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY ); @SuppressWarnings("unchecked") List<Seller> results2 = criteria.list(); assertTrue( results2.size() == 2 ); assertTrue( results2.contains( seller1 ) ); assertTrue( results2.contains( seller2 ) ); session.close(); } @Test public void testMappedBy() { Set<Customer> customersAll = new LinkedHashSet<Customer>(); Seller[] sellers = persist( "mappedby" ); customersAll.addAll( sellers[0].getSoldTo() ); customersAll.addAll( sellers[1].getSoldTo() ); Customer[] customers = customersAll.toArray( new Customer[customersAll.size()] ); Customer customer1 = customers[0]; Customer customer2 = customers[1]; Customer customer3 = customers[2]; Session session = openSession(); Criteria criteria = session.createCriteria( Customer.class, "c" ); criteria.createCriteria( "c.boughtFrom", "s", JoinType.INNER_JOIN, Restrictions.eq( "name", "mappedby-seller1" ) ); criteria.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY ); @SuppressWarnings("unchecked") List<Customer> results = criteria.list(); assertTrue( results.size() == 2 ); assertTrue( results.contains( customer1 ) ); assertTrue( results.contains( customer2 ) ); assertFalse( results.contains( customer3 ) ); criteria = session.createCriteria( Customer.class, "c" ); criteria.createCriteria( "c.boughtFrom", "s", JoinType.INNER_JOIN, Restrictions.eq( "name", "mappedby-seller2" ) ); criteria.setResultTransformer( Criteria.DISTINCT_ROOT_ENTITY ); @SuppressWarnings("unchecked") List<Customer> results2 = criteria.list(); assertTrue( results2.size() == 2 ); assertFalse( results2.contains( customer1 ) ); assertTrue( results2.contains( customer2 ) ); assertTrue( results2.contains( customer3 ) ); session.close(); } @Override protected Class[] getAnnotatedClasses() { return new Class[] {Seller.class, Customer.class}; } }