diff --git a/hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/basic/ConcatTest.java b/hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/basic/ConcatTest.java new file mode 100644 index 0000000000..8837182208 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/jpa/test/criteria/basic/ConcatTest.java @@ -0,0 +1,146 @@ +/* + * 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 . + */ +package org.hibernate.jpa.test.criteria.basic; + +import javax.persistence.Entity; +import javax.persistence.EntityManager; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Table; +import javax.persistence.criteria.CriteriaBuilder; +import javax.persistence.criteria.CriteriaQuery; +import javax.persistence.criteria.Root; +import java.io.Serializable; +import java.util.List; + +import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; + +import org.junit.Before; +import org.junit.Test; + +import org.hibernate.testing.TestForIssue; + +import static org.hamcrest.CoreMatchers.is; +import static org.junit.Assert.assertThat; + +/** + * @author Andrea Boriero + */ +@TestForIssue(jiraKey = "HHH-10843") +public class ConcatTest extends BaseEntityManagerFunctionalTestCase { + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] {TestEntity.class}; + } + + @Before + public void setUp() { + EntityManager entityManager = getOrCreateEntityManager(); + entityManager.getTransaction().begin(); + try { + TestEntity testEntity = new TestEntity(); + testEntity.setName( "test_1" ); + entityManager.persist( testEntity ); + entityManager.getTransaction().commit(); + } + catch (Exception e) { + if ( entityManager.getTransaction().isActive() ) { + entityManager.getTransaction().rollback(); + } + throw e; + } + finally { + entityManager.close(); + } + } + + @Test + public void testSelectCaseWithConcat() throws Exception { + EntityManager entityManager = getOrCreateEntityManager(); + entityManager.getTransaction().begin(); + try { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery( Object[].class ); + Root testEntity = query.from( TestEntity.class ); + + query.multiselect( + cb.selectCase() + .when( cb.isNotNull( testEntity.get( "id" ) ), cb.concat( "test", cb.literal( "_1" ) ) ) + .otherwise( cb.literal( "Empty" ) ), + cb.trim( cb.concat( ".", cb.literal( "Test " ) ) ) + ); + + final List results = entityManager.createQuery( query ).getResultList(); + assertThat( results.size(), is( 1 ) ); + assertThat( results.get( 0 )[0], is( "test_1" ) ); + assertThat( results.get( 0 )[1], is( ".Test" ) ); + entityManager.getTransaction().commit(); + } + catch (Exception e) { + if ( entityManager.getTransaction().isActive() ) { + entityManager.getTransaction().rollback(); + } + throw e; + } + finally { + entityManager.close(); + } + } + + @Test + public void testConcat() throws Exception { + EntityManager entityManager = getOrCreateEntityManager(); + entityManager.getTransaction().begin(); + try { + CriteriaBuilder cb = entityManager.getCriteriaBuilder(); + CriteriaQuery query = cb.createQuery(); + Root testEntity = query.from( TestEntity.class ); + + query.select( testEntity ).where( cb.equal( testEntity.get( "name" ), cb.concat( "test", cb.literal( "_1" ) ) ) ); + + final List results = entityManager.createQuery( query ).getResultList(); + entityManager.getTransaction().commit(); + + assertThat( results.size(), is( 1 ) ); + } + catch (Exception e) { + if ( entityManager.getTransaction().isActive() ) { + entityManager.getTransaction().rollback(); + } + throw e; + } + finally { + entityManager.close(); + } + } + + @Entity(name = "TestEntity") + @Table(name = "TEST_ENTITY") + public static class TestEntity implements Serializable { + @Id + @GeneratedValue + private Integer id; + private String name; + + public Integer getId() { + return id; + } + + public void setId(Integer id) { + this.id = id; + } + + public String getName() { + return name; + } + + public void setName(String name) { + this.name = name; + } + } +}