/* * 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.paths; import java.util.ArrayList; import java.util.Collections; import java.util.List; import javax.persistence.criteria.CriteriaQuery; 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.Article; import org.hibernate.jpa.test.metamodel.Article_; import org.hibernate.jpa.test.metamodel.MapEntity; import org.hibernate.jpa.test.metamodel.MapEntityLocal; import org.hibernate.jpa.test.metamodel.MapEntity_; import org.hibernate.jpa.test.metamodel.Translation; import org.hibernate.query.criteria.HibernateCriteriaBuilder; import org.hibernate.testing.FailureExpected; import org.hibernate.testing.TestForIssue; import org.junit.Test; import static org.hibernate.testing.transaction.TransactionUtil.doInJPA; /** * @author Steve Ebersole */ public class PluralAttributeExpressionsTest extends AbstractMetamodelSpecificTest { @Override public Class[] getAnnotatedClasses() { List<Class> classes = new ArrayList<>(); Collections.addAll( classes, super.getAnnotatedClasses() ); classes.add( MapEntity.class ); classes.add( MapEntityLocal.class ); classes.add( Article.class ); classes.add( Translation.class ); return classes.toArray( new Class[ classes.size() ] ); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // IS [NOT] EMPTY @Test public void testCollectionIsEmptyHql() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createQuery( "select a from Address a where a.phones is empty" ).getResultList(); }); } @Test public void testCollectionIsEmptyCriteria() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery<Address> criteria = cb.createQuery( Address.class ); final Root<Address> root = criteria.from( Address.class); criteria.select( root ) .where( cb.isEmpty( root.get( Address_.phones ) ) ); entityManager.createQuery( criteria ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) @FailureExpected( jiraKey = "HHH-6686") public void testElementMapIsEmptyHql() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createQuery( "select m from MapEntity m where m.localized is empty" ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) @FailureExpected( jiraKey = "HHH-6686") public void testElementMapIsEmptyCriteria() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery<MapEntity> criteria = cb.createQuery( MapEntity.class ); final Root<MapEntity> root = criteria.from( MapEntity.class); criteria.select( root ) .where( cb.isMapEmpty( root.get( MapEntity_.localized ) ) ); entityManager.createQuery( criteria ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) public void testEntityMapIsEmptyHql() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createQuery( "select a from Article a where a.translations is empty" ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) public void testEntityMapIsEmptyCriteria() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery<Article> criteria = cb.createQuery( Article.class ); final Root<Article> root = criteria.from( Article.class); criteria.select( root ) .where( cb.isEmpty( root.get( Article_.translations ) ) ); entityManager.createQuery( criteria ).getResultList(); }); } // ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ // SIZE @Test public void testCollectionSizeHql() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createQuery( "select a from Address a where size(a.phones) > 1" ).getResultList(); }); } @Test public void testCollectionSizeCriteria() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery<Address> criteria = cb.createQuery( Address.class ); final Root<Address> root = criteria.from( Address.class); criteria.select( root ) .where( cb.gt( cb.size( root.get( Address_.phones ) ), 1 ) ); entityManager.createQuery( criteria ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) public void testElementMapSizeHql() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createQuery( "select m from MapEntity m where size( m.localized ) > 1" ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) public void testElementMapSizeCriteria() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery<MapEntity> criteria = cb.createQuery( MapEntity.class ); final Root<MapEntity> root = criteria.from( MapEntity.class); criteria.select( root ) .where( cb.gt( cb.mapSize( root.get( MapEntity_.localized ) ), 1 ) ); entityManager.createQuery( criteria ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) public void testEntityMapSizeHql() { doInJPA( this::entityManagerFactory, entityManager -> { entityManager.createQuery( "select a from Article a where size(a.translations) > 1" ).getResultList(); }); } @Test @TestForIssue( jiraKey = "HHH-11225" ) public void testEntityMapSizeCriteria() { doInJPA( this::entityManagerFactory, entityManager -> { final HibernateCriteriaBuilder cb = (HibernateCriteriaBuilder) entityManager.getCriteriaBuilder(); final CriteriaQuery<Article> criteria = cb.createQuery( Article.class ); final Root<Article> root = criteria.from( Article.class); criteria.select( root ) .where( cb.gt( cb.mapSize( root.get( Article_.translations ) ), 1 ) ); entityManager.createQuery( criteria ).getResultList(); }); } }