/* * 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.simplecase; import javax.persistence.Entity; import javax.persistence.EntityManager; import javax.persistence.Id; import javax.persistence.Table; import javax.persistence.Tuple; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Expression; import javax.persistence.criteria.Path; import javax.persistence.criteria.Root; import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; import org.junit.Test; import org.hibernate.testing.TestForIssue; import static javax.persistence.criteria.CriteriaBuilder.SimpleCase; /** * Mote that these are simply performing syntax checking (can the criteria query * be properly compiled and executed) * * @author Steve Ebersole */ public class BasicSimpleCaseTest extends BaseEntityManagerFunctionalTestCase { @Override protected Class<?>[] getAnnotatedClasses() { return new Class[] {Customer.class}; } @Test @TestForIssue(jiraKey = "HHH-9343") public void testCaseStringResult() { EntityManager em = getOrCreateEntityManager(); CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Tuple> query = builder.createTupleQuery(); Root<Customer> root = query.from( Customer.class ); Path<String> emailPath = root.get( "email" ); CriteriaBuilder.Case<String> selectCase = builder.selectCase(); selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), "Long" ); selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), "Normal" ); Expression<String> emailType = selectCase.otherwise( "Unknown" ); query.multiselect( emailPath, emailType ); em.createQuery( query ).getResultList(); } @Test @TestForIssue(jiraKey = "HHH-9343") public void testCaseIntegerResult() { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Tuple> query = builder.createTupleQuery(); Root<Customer> root = query.from( Customer.class ); Path<String> emailPath = root.get( "email" ); CriteriaBuilder.Case<Integer> selectCase = builder.selectCase(); selectCase.when( builder.greaterThan( builder.length( emailPath ), 13 ), 2 ); selectCase.when( builder.greaterThan( builder.length( emailPath ), 12 ), 1 ); Expression<Integer> emailType = selectCase.otherwise( 0 ); query.multiselect( emailPath, emailType ); em.createQuery( query ).getResultList(); } @Test @TestForIssue(jiraKey = "HHH-9343") public void testCaseLiteralResult() { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Boolean> cq = cb.createQuery( Boolean.class ); Root<Customer> expense_ = cq.from( Customer.class ); em.createQuery( cq.distinct( true ).where( cb.equal( expense_.get( "email" ), "@hibernate.com" ) ).multiselect( cb.selectCase() .when( cb.gt( cb.count( expense_ ), cb.literal( 0L ) ), cb.literal( true ) ) .otherwise( cb.literal( false ) ) ) ).getSingleResult(); } @Test @TestForIssue(jiraKey = "HHH-9343") public void testCaseLiteralResult2() { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Boolean> cq = cb.createQuery( Boolean.class ); Root<Customer> expense_ = cq.from( Customer.class ); em.createQuery( cq.distinct( true ).where( cb.equal( expense_.get( "email" ), "@hibernate.com" ) ).multiselect( cb.selectCase() .when( cb.gt( cb.count( expense_ ), cb.literal( 0L ) ), true ) .otherwise( false ) ) ).getSingleResult(); } @Test public void testCaseInOrderBy() { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Customer> query = builder.createQuery( Customer.class ); Root<Customer> root = query.from( Customer.class ); query.select( root ); Path<String> emailPath = root.get( "email" ); SimpleCase<String, Integer> orderCase = builder.selectCase( emailPath ); orderCase = orderCase.when( "test@test.com", 1 ); orderCase = orderCase.when( "test2@test.com", 2 ); query.orderBy( builder.asc( orderCase.otherwise( 0 ) ) ); em.createQuery( query ); } @Test public void testCaseInOrderBy2() { EntityManager em = getOrCreateEntityManager(); em.getTransaction().begin(); CriteriaBuilder builder = em.getCriteriaBuilder(); CriteriaQuery<Customer> query = builder.createQuery( Customer.class ); Root<Customer> root = query.from( Customer.class ); query.select( root ); Path<String> emailPath = root.get( "email" ); SimpleCase<String, String> orderCase = builder.selectCase( emailPath ); orderCase = orderCase.when( "test@test.com", "a" ); orderCase = orderCase.when( "test2@test.com", "b" ); query.orderBy( builder.asc( orderCase.otherwise( "c" ) ) ); em.createQuery( query ); } @Entity(name = "Customer") @Table(name = "customer") public static class Customer { private Integer id; private String email; @Id public Integer getId() { return id; } public void setId(Integer id) { this.id = id; } public String getEmail() { return email; } public void setEmail(String email) { this.email = email; } } }