/*
* 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.jpa.test.criteria.basic;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import java.util.List;
import javax.persistence.EntityManager;
import javax.persistence.criteria.CriteriaBuilder;
import javax.persistence.criteria.CriteriaQuery;
import javax.persistence.criteria.ListJoin;
import javax.persistence.criteria.Root;
import org.hibernate.jpa.test.metamodel.AbstractMetamodelSpecificTest;
import org.hibernate.jpa.test.metamodel.Address;
import org.hibernate.jpa.test.metamodel.Address_;
import org.hibernate.jpa.test.metamodel.Phone;
import org.hibernate.testing.TestForIssue;
import org.junit.Test;
/**
* Tests usage of {@link ListJoin#index()}
*
* @author Brett Meyer
*/
public class ListIndexTest extends AbstractMetamodelSpecificTest {
@Test
@TestForIssue(jiraKey = "HHH-8404")
public void testListIndex() {
EntityManager em = getOrCreateEntityManager();
em.getTransaction().begin();
Address address1 = new Address();
address1.setId( "a1" );
Phone phone1 = new Phone();
phone1.setId( "p1" );
phone1.setAddress( address1 );
Phone phone2 = new Phone();
phone2.setId( "p2" );
phone2.setAddress( address1 );
address1.getPhones().add( phone1 );
address1.getPhones().add( phone2 );
Address address2 = new Address();
address2.setId( "a2" );
Phone phone3 = new Phone();
phone3.setId( "p3" );
phone3.setAddress( address2 );
address2.getPhones().add( phone3 );
em.persist( phone1 );
em.persist( phone2 );
em.persist( phone3 );
em.persist( address1 );
em.persist( address2 );
em.getTransaction().commit();
em.clear();
CriteriaBuilder cb = em.getCriteriaBuilder();
CriteriaQuery<Address> criteria = cb.createQuery( Address.class );
Root<Address> addressRoot = criteria.from( Address.class );
ListJoin<Address, Phone> phones = addressRoot.join( Address_.phones );
criteria.where( cb.gt( phones.index(), 0 ) );
List<Address> results = em.createQuery( criteria ).getResultList();
assertNotNull( results );
// Ensure that the "index(phones) > 0" condition was included on the inner join, meaning only address1
// (> 1 phone) was returned.
assertEquals( 1, results.size() );
assertEquals( address1.getId(), results.get( 0 ).getId() );
}
}