diff --git a/hibernate-core/src/test/java/org/hibernate/test/hql/SelectNewEmbeddedIdTest.java b/hibernate-core/src/test/java/org/hibernate/test/hql/SelectNewEmbeddedIdTest.java new file mode 100644 index 0000000000..597d775d23 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/hql/SelectNewEmbeddedIdTest.java @@ -0,0 +1,139 @@ +/* + * 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.test.hql; + +import java.io.Serializable; + +import javax.persistence.Embeddable; +import javax.persistence.EmbeddedId; +import javax.persistence.Entity; +import javax.persistence.EntityManager; +import javax.persistence.Query; + +import org.hibernate.jpa.test.BaseEntityManagerFunctionalTestCase; +import org.hibernate.testing.TestForIssue; +import org.junit.Test; + +import static org.junit.Assert.assertEquals; + +/** + * Test entities with a non-identifier property named 'id' with an EmbeddedId using + * the constructor new syntax. + * + * @author Chris Cranford + */ +public class SelectNewEmbeddedIdTest extends BaseEntityManagerFunctionalTestCase { + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { Simple.class }; + } + + private void assertQueryRowCount(String queryString, int rowCount) { + EntityManager entityManager = getOrCreateEntityManager(); + try { + // persist the data + entityManager.getTransaction().begin(); + entityManager.persist( new Simple( new SimpleId( 1, 1 ), 1 ) ); + entityManager.getTransaction().commit(); + + Query query = entityManager.createQuery( queryString ); + assertEquals( rowCount, query.getResultList().size() ); + } + catch ( Exception e ) { + if ( entityManager.getTransaction().isActive() ) { + entityManager.getTransaction().rollback(); + } + throw e; + } + finally { + entityManager.close(); + } + } + + @Test + @TestForIssue(jiraKey = "HHH-4712") + public void testSelectNewListEntity() { + assertQueryRowCount( "select new list(e) FROM Simple e", 1 ); + } + + @Test + @TestForIssue(jiraKey = "HHH-4712") + public void testSelectNewListEmbeddedIdValue() { + assertQueryRowCount( "select new list(e.simpleId) FROM Simple e", 1 ); + } + + @Test + @TestForIssue(jiraKey = "HHH-4712") + public void testSelectNewMapEntity() { + assertQueryRowCount( "select new map(e.id, e) FROM Simple e", 1 ); + } + + @Test + @TestForIssue(jiraKey = "HHH-4712") + public void testSelectNewMapEmbeddedIdValue() { + assertQueryRowCount( "select new map(e.simpleId, e.simpleId) FROM Simple e", 1 ); + } + + @Test + @TestForIssue(jiraKey = "HHH-4712") + public void testSelectNewObjectEntity() { + assertQueryRowCount( "select new " + Wrapper.class.getName() + "(e) FROM Simple e", 1 ); + } + + @Test + @TestForIssue(jiraKey = "HHH-4712") + public void testSelectNewObjectEmbeddedIdValue() { + assertQueryRowCount( "select new " + Wrapper.class.getName() + "(e.simpleId) FROM Simple e", 1 ); + } + + @Entity(name = "Simple") + public static class Simple { + @EmbeddedId + private SimpleId simpleId; + private int id; + + public Simple() { + + } + + public Simple(SimpleId simpleId, int id) { + this.simpleId = simpleId; + this.id = id; + } + } + + @Embeddable + public static class SimpleId implements Serializable { + private int realId; + private int otherId; + + public SimpleId() { + } + + public SimpleId(int realId, int otherId) { + this.realId = realId; + this.otherId = otherId; + } + } + + public static class Wrapper { + private Simple simple; + + public Wrapper() { + + } + + public Wrapper(Simple simple) { + this.simple = simple; + } + + public Wrapper(SimpleId simpleId) { + + } + } +}