diff --git a/hibernate-core/src/test/java/org/hibernate/test/hql/joinedSubclass/JoinedSubclassSubQueryTest.java b/hibernate-core/src/test/java/org/hibernate/test/hql/joinedSubclass/JoinedSubclassSubQueryTest.java new file mode 100644 index 0000000000..c877d63605 --- /dev/null +++ b/hibernate-core/src/test/java/org/hibernate/test/hql/joinedSubclass/JoinedSubclassSubQueryTest.java @@ -0,0 +1,143 @@ +/* + * 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.joinedSubclass; + +import java.util.List; +import javax.persistence.Basic; +import javax.persistence.Column; +import javax.persistence.Entity; +import javax.persistence.GeneratedValue; +import javax.persistence.Id; +import javax.persistence.Inheritance; +import javax.persistence.InheritanceType; +import javax.persistence.JoinColumn; +import javax.persistence.ManyToOne; +import javax.persistence.OneToMany; +import javax.persistence.Table; + +import org.junit.Test; + +import org.hibernate.Session; + +import org.hibernate.testing.TestForIssue; +import org.hibernate.testing.junit4.BaseCoreFunctionalTestCase; + +/** + * @author Stephen Fikes + * @author Gail Badner + */ +public class JoinedSubclassSubQueryTest extends BaseCoreFunctionalTestCase { + + @Test + @TestForIssue(jiraKey = "HHH-11182") + public void testSubQueryConstraintPropertyInSuperclassTable() { + + Session s = openSession(); + try { + s.getTransaction().begin(); + // employee.firstName is in Person table (not Employee) + String queryHQL = "from InvestmentCompany investmentCompany " + + "where exists " + + "(select employee " + + "from investmentCompany.employees as employee " + + " where employee.firstName = 'Joe')"; + s.createQuery( queryHQL ).uniqueResult(); + s.getTransaction().commit(); + } + catch (Exception e) { + if ( s.getTransaction() != null && s.getTransaction().isActive() ) { + s.getTransaction().rollback(); + } + throw e; + } + finally { + s.close(); + } + } + + @Test + @TestForIssue(jiraKey = "HHH-11182") + public void testSubQueryConstraintPropertyInEntityTable() { + + Session s = openSession(); + try { + s.getTransaction().begin(); + // employee.employeeNumber is in Employee table + String queryHQL = "from InvestmentCompany investmentCompany " + + "where exists " + + "(select employee " + + "from investmentCompany.employees as employee " + + " where employee.employeeNumber = 666 )"; + s.createQuery( queryHQL ).uniqueResult(); + } + catch (Exception e) { + if ( s.getTransaction() != null && s.getTransaction().isActive() ) { + s.getTransaction().rollback(); + } + throw e; + } + finally { + s.close(); + } + } + + @Override + protected Class[] getAnnotatedClasses() { + return new Class[] { + InvestmentCompany.class, + Person.class, + Employee.class + }; + } + + @Entity(name = "InvestmentCompany") + @Table + public static class InvestmentCompany { + @Id + @GeneratedValue + @Column + private Long id; + + @Basic(optional = false) + @Column(nullable = false, length = 255) + private String fullName; + + @Basic(optional = false) + @Column(nullable = false, length = 16) + private String shortName; + + @OneToMany(mappedBy = "company") + List employees; + } + + @Entity(name = "Person") + @Inheritance(strategy = InheritanceType.JOINED) + public static abstract class Person { + @Id + @GeneratedValue + @Column + private Long id; + + @Basic(optional = false) + @Column(nullable = false) + private String firstName; + } + + @Entity(name = "Employee") + public static class Employee extends Person { + @Id + @GeneratedValue + @Column + private Long id; + + private int employeeNumber; + + @ManyToOne(optional = false) + @JoinColumn(nullable = false) + private InvestmentCompany company; + } +}