Skip to content

Commit 8d7d84f

Browse files
committed
HHH-17897 Fix support for joining CTEs in HQL
1 parent 550e3ea commit 8d7d84f

File tree

2 files changed

+45
-1
lines changed

2 files changed

+45
-1
lines changed

hibernate-core/src/main/java/org/hibernate/query/hql/internal/QualifiedJoinPathConsumer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -302,7 +302,7 @@ public void consumeIdentifier(String identifier, boolean isTerminal, boolean all
302302
final String fullPath = path.toString();
303303
final EntityDomainType<?> joinedEntityType = creationState.getCreationContext()
304304
.getJpaMetamodel()
305-
.resolveHqlEntityReference( fullPath );
305+
.getHqlEntityReference( fullPath );
306306
if ( joinedEntityType == null ) {
307307
final SqmCteStatement<?> cteStatement = creationState.findCteStatement( fullPath );
308308
if ( cteStatement != null ) {

hibernate-core/src/test/java/org/hibernate/orm/test/query/CteTests.java

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,13 +17,16 @@
1717
import org.hibernate.query.criteria.JpaCteCriteria;
1818
import org.hibernate.query.criteria.JpaEntityJoin;
1919
import org.hibernate.query.criteria.JpaJoin;
20+
import org.hibernate.query.criteria.JpaJoinedFrom;
2021
import org.hibernate.query.criteria.JpaParameterExpression;
2122
import org.hibernate.query.criteria.JpaRoot;
2223
import org.hibernate.query.criteria.JpaSubQuery;
2324
import org.hibernate.query.spi.QueryImplementor;
25+
import org.hibernate.query.sqm.tree.SqmJoinType;
2426
import org.hibernate.sql.ast.tree.cte.CteMaterialization;
2527
import org.hibernate.sql.ast.tree.cte.CteSearchClauseKind;
2628

29+
import org.hibernate.testing.orm.junit.Jira;
2730
import org.hibernate.testing.orm.junit.SkipForDialect;
2831
import org.hibernate.testing.orm.domain.StandardDomainModel;
2932
import org.hibernate.testing.orm.domain.contacts.Address;
@@ -88,6 +91,47 @@ public void testBasic(SessionFactoryScope scope) {
8891
);
8992
}
9093

94+
@Test
95+
@Jira("https://hibernate.atlassian.net/browse/HHH-17897")
96+
public void testBasicJoined(SessionFactoryScope scope) {
97+
scope.inTransaction(
98+
session -> {
99+
final HibernateCriteriaBuilder cb = session.getCriteriaBuilder();
100+
final JpaCriteriaQuery<Tuple> cte = cb.createTupleQuery();
101+
final JpaRoot<Contact> cteRoot = cte.from( Contact.class );
102+
cte.multiselect( cteRoot.get( "id" ).alias( "id" ), cteRoot.get( "name" ).alias( "name" ) );
103+
cte.where( cb.equal( cteRoot.get( "gender" ), Contact.Gender.FEMALE ) );
104+
105+
final JpaCriteriaQuery<Tuple> cq = cb.createTupleQuery();
106+
final JpaCteCriteria<Tuple> femaleContacts = cq.with( cte );
107+
108+
final JpaRoot<Contact> root = cq.from( Contact.class );
109+
final JpaJoinedFrom<?, Tuple> join = root.join( femaleContacts );
110+
join.on( cb.equal( root.get( "id" ), join.get( "id" ) ) );
111+
112+
cq.multiselect( root.get( "id" ), root.get( "name" ) );
113+
cq.orderBy( cb.asc( root.get( "id" ) ) );
114+
115+
final QueryImplementor<Tuple> query = session.createQuery(
116+
"with femaleContacts as (" +
117+
"select c.id id, c.name name from Contact c where c.gender = FEMALE" +
118+
")" +
119+
"select c.id, c.name from Contact c join femaleContacts f on c.id = f.id order by c.id",
120+
Tuple.class
121+
);
122+
verifySame(
123+
session.createQuery( cq ).getResultList(),
124+
query.getResultList(),
125+
list -> {
126+
assertEquals( 2, list.size() );
127+
assertEquals( "Jane", list.get( 0 ).get( 1, Contact.Name.class ).getFirst() );
128+
assertEquals( "Granny", list.get( 1 ).get( 1, Contact.Name.class ).getFirst() );
129+
}
130+
);
131+
}
132+
);
133+
}
134+
91135
@Test
92136
public void testNested(SessionFactoryScope scope) {
93137
scope.inTransaction(

0 commit comments

Comments
 (0)