Skip to content

Commit a123562

Browse files
randymaydreab8
authored andcommitted
HHH-12076 Fix index out of bounds exception and allow table group joins for collection joins as well
1 parent 48b4ba7 commit a123562

File tree

3 files changed

+14
-5
lines changed

3 files changed

+14
-5
lines changed

hibernate-core/src/main/java/org/hibernate/engine/internal/JoinSequence.java

Lines changed: 11 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import org.hibernate.engine.spi.SessionFactoryImplementor;
1515
import org.hibernate.hql.internal.ast.tree.ImpliedFromElement;
1616
import org.hibernate.internal.util.StringHelper;
17+
import org.hibernate.persister.collection.AbstractCollectionPersister;
1718
import org.hibernate.persister.collection.QueryableCollection;
1819
import org.hibernate.persister.entity.AbstractEntityPersister;
1920
import org.hibernate.persister.entity.Joinable;
@@ -422,9 +423,16 @@ private boolean needsTableGroupJoin(List<Join> joins, String withClauseFragment)
422423
}
423424

424425
private boolean isSubclassAliasDereferenced(Join join, String withClauseFragment) {
425-
if ( join.getJoinable() instanceof AbstractEntityPersister ) {
426-
AbstractEntityPersister persister = (AbstractEntityPersister) join.getJoinable();
427-
int subclassTableSpan = persister.getSubclassTableSpan();
426+
Object joinable = join.getJoinable();
427+
if ( joinable instanceof AbstractCollectionPersister ) {
428+
final AbstractCollectionPersister collectionPersister = (AbstractCollectionPersister) joinable;
429+
if ( collectionPersister.getElementType().isEntityType() ) {
430+
joinable = ( collectionPersister ).getElementPersister();
431+
}
432+
}
433+
if ( joinable instanceof AbstractEntityPersister ) {
434+
final AbstractEntityPersister persister = (AbstractEntityPersister) joinable;
435+
final int subclassTableSpan = persister.getSubclassTableSpan();
428436
for ( int j = 1; j < subclassTableSpan; j++ ) {
429437
String subclassAlias = AbstractEntityPersister.generateTableAlias( join.getAlias(), j );
430438
if ( isAliasDereferenced( withClauseFragment, subclassAlias ) ) {

hibernate-core/src/main/java/org/hibernate/hql/internal/ast/HqlSqlWalker.java

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -557,7 +557,9 @@ public void visit(AST node) {
557557
}
558558
else {
559559
referencedFromElement = fromElement;
560-
joinAlias = extractAppliedAlias( dotNode );
560+
if ( fromElement != null ) {
561+
joinAlias = extractAppliedAlias( dotNode );
562+
}
561563
// TODO : temporary
562564
// needed because currently persister is the one that
563565
// creates and renders the join fragments for inheritance

hibernate-core/src/test/java/org/hibernate/query/hhh12076/HbmMappingJoinClassTest.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -80,7 +80,6 @@ protected void prepareTest() {
8080
}
8181

8282
@Test
83-
@FailureExpected( jiraKey = "HHH-12076")
8483
public void testClassExpressionInOnClause() {
8584
doInHibernate( this::sessionFactory, session -> {
8685
List<SettlementTask> results = session.createQuery(

0 commit comments

Comments
 (0)